堆排序是利用」堆「的數據特性來進行數據管理。首先說一下什麼是堆,堆的本質是經過排序的完全二叉樹,其中任一非終端節點的數據值均不大於(或不小於)其左孩子和右孩子節點的值。根結點(亦稱爲堆頂)的關鍵字是堆裏所有結點關鍵字中最小者的堆稱爲最小堆。 根結點(亦稱爲堆頂)的關鍵字是堆裏所有結點關鍵字中最大者,稱爲最大堆。
堆排序的最壞的運行時間是O(nlgn).
要用堆排序,首先要知道最大堆,最小堆,最大堆滿足A[PARENT(i)]>=A(i),最小堆滿足A[PARENT(i)]<=A(i);
MAX-HEAPIFY代碼如下:
首先parent(i)=floor(1/2); left=2*i+1;right=2*(i+1);
第二步,要建立堆,用自底向上的方法利用過程,首先通過最大堆把一個數組轉化爲最大堆,代碼如下:
初始化中,第一次迭代前,i=floor(i/2),而floor(i/2)+1 ... n都是葉子節點,因此是最大堆的根節點。
最後就是排序了;
最後貼一下全部的代碼:
void max_heapSize(int * arr,int i,int heapSize){
int left =2*i+1;
int right = 2*i+2;
int largest = i;
if (left<=heapSize && arr[left]>arr[i]){
largest =left;
}
if(right<=heapSize && arr[right]>arr[largest]) {
largest=right;
}
if (largest != i && right<=heapSize){
int temp =arr[i];
arr[i] = arr[largest];
arr[largest] = temp;
max_heapSize(arr,largest,heapSize);
}
}
void buid_heap(int *arr,int length,int heapSize){
for(int i=floor(length/2);i>=0;i--){
max_heapSize(arr,i,heapSize);
}
}
void heap_sort(int *arr,int length,int heapSize){
buid_heap(arr,length,heapSize);
for (int i=heapSize;i>0;i--){
int tep=arr[i];
arr[i]=arr[0];
arr[0]=tep;
heapSize=heapSize-1;
max_heapSize(arr, 0,heapSize);
}
}
int main(){
int arr[10]={16,14,10,8,7,9,3,2,29,22};
heap_sort(arr,10,10);
for (int r=0;r<10;r++){
std::cout<<arr[r]<<std::endl;
}
}