Kết hợp lựa chọn bài tự cùng đôi bài tự ý nghĩ, có thể thông qua lợi dụng đôi số liệu kết cấu tới ưu hoá lựa chọn bài tự quá trình, khiến cho bài tự thuật toán càng thêm hiệu suất cao. Tại đây loại kết hợp trung, chúng ta lợi dụng đôi đặc tính tới nhanh chóng định vị cùng lựa chọn chưa bài tự bộ phận nhỏ nhất nguyên tố, tránh cho lựa chọn bài tự trung mỗi lần tuyến tính tìm tòi chi tiêu.
Lựa chọn bài tự cùng đôi bài tự kết hợp ý nghĩ
Lựa chọn bài tự cơ bản tư tưởng là mỗi lần chưa bao giờ bài tự bộ phận lựa chọn nhỏ nhất ( hoặc lớn nhất ) nguyên tố, phóng tới đã bài tự bộ phận cuối cùng. Kết hợp đôi bài tự ý nghĩ, chúng ta có thể lợi dụng nhỏ nhất đôi tới giữ gìn chưa bài tự bộ phận nguyên tố, mỗi lần từ đôi đỉnh lấy ra nhỏ nhất nguyên tố, để vào đã bài tự bộ phận, sau đó điều chỉnh đôi, lấy bảo trì đôi tính chất.
Thực hiện bước đi
- Thành lập nhỏ nhất đôi:Đem đãi bài tự số tổ kiến lập thành một cái nhỏ nhất đôi.
- Lựa chọn nhỏ nhất nguyên tố:Từ đôi đỉnh ( nhỏ nhất giá trị ) bắt đầu lựa chọn, đem này để vào đã bài tự bộ phận.
- Giữ gìn đôi tính chất:Mỗi lần lựa chọn thao tác sau, yêu cầu điều chỉnh đôi, khiến cho còn thừa nguyên tố vẫn như cũ cấu thành nhỏ nhất đôi.
- Lặp lại trở lên bước đi:Thẳng đến sở hữu nguyên tố đều bị bài tự.
C ngôn ngữ số hiệu thực hiện
Phía dưới là lợi dụng C ngôn ngữ thực hiện kết hợp lựa chọn bài tự cùng đôi bài tự ý nghĩ thí dụ mẫu số hiệu:
#include<stdio.h>
// hàm số: Đối số tổ tử thụ lấy căn tiết điểm i tiến hành đôi hóa, n là đôi lớn nhỏ
voidheapify(intarr[],intn,inti){
intsmallest=i;// khởi động lại nhỏ nhất giá trị hướng dẫn tra cứu vì i
intleft=2*i+1;// tả tử tiết điểm hướng dẫn tra cứu vì 2*i + 1
intright=2*i+2;// hữu tử tiết điểm hướng dẫn tra cứu vì 2*i + 2
// nếu tả tử tiết điểm so căn tiết điểm tiểu
if(left<n&&arr[left]<arr[smallest])
smallest=left;
// nếu hữu tử tiết điểm so trước mặt nhỏ nhất giá trị tiểu
if(right<n&&arr[right]<arr[smallest])
smallest=right;
// nếu nhỏ nhất giá trị không phải căn tiết điểm
if(smallest!=i){
// trao đổi nhỏ nhất giá trị cùng căn tiết điểm
inttemp=arr[i];
arr[i]=arr[smallest];
arr[smallest]=temp;
// đệ quy điều chỉnh chịu ảnh hưởng tử thụ
heapify(arr,n,smallest);
}
}
// hàm số: Tiến hành đôi bài tự
voidheapSort(intarr[],intn){
// xây dựng đôi ( một lần nữa sắp hàng số tổ )
for(inti=n/2-1;i>=0;i--)
heapify(arr,n,i);
// theo thứ tự từ đôi trung lấy ra nguyên tố
for(inti=n-1;i>0;i--){
// đem trước mặt căn tiết điểm di đến cuối cùng
inttemp=arr[0];
arr[0]=arr[i];
arr[i]=temp;
// đối còn thừa đôi tiến hành đôi hóa
heapify(arr,i,0);
}
}
// hàm số: Lợi dụng đôi bài tự nguyên lý chấp hành lựa chọn bài tự
voidselectionHeapSort(intarr[],intn){
// từ số tổ xây dựng nhỏ nhất đôi
heapSort(arr,n);
// hiện tại arr[0] bao hàm nhỏ nhất nguyên tố, đem này chuyển qua cuối cùng cũng lặp lại
for(inti=0;i<n;i++){
// trao đổi arr[0] cùng arr[i]
inttemp=arr[0];
arr[0]=arr[i];
arr[i]=temp;
// trùng kiến đôi, bài trừ đã bài tự cuối cùng một cái nguyên tố
heapify(arr,i,0);
}
}
// hàm số: Đóng dấu số tổ
voidprintArray(intarr[],intn){
for(inti=0;i<n;++i)
printf("%d",arr[i]);
printf("\n");
}
// chủ hàm số: Thí nghiệm trở lên công năng
intmain(){
intarr[]={12,11,13,5,6,7};
intn=sizeof(arr)/sizeof(arr[0]);
printf("Nguyên thủy số tổ:\n");
printArray(arr,n);
selectionHeapSort(arr,n);
printf("Lựa chọn cùng đôi bài tự kết hợp sau bài tự số tổ:\n");
printArray(arr,n);
return0;
}
}
Thí dụ mẫu thuyết minh
Ở mặt trên số hiệu trung:
heapify()
Hàm số dùng cho giữ gìn đôi tính chất.heapSort()
Hàm số dùng cho đối số tổ tiến hành đôi bài tự.selectionHeapSort()
Hàm số kết hợp lựa chọn bài tự cùng đôi bài tự ý nghĩ, thông qua thành lập nhỏ nhất đôi cùng mỗi lần lựa chọn thao tác tới thực hiện bài tự.main()
Hàm số trung triển lãm như thế nào sử dụngselectionHeapSort()
Hàm số đối số tổ tiến hành bài tự, cũng phát ra bài tự sau kết quả.
Loại này kết hợp lựa chọn bài tự cùng đôi bài tự phương pháp lợi dụng đôi ưu thế, khiến cho lựa chọn quá trình càng cao hiệu, do đó tăng lên chỉnh thể bài tự thuật toán tính năng.