##堆排序
堆排序分為兩個過程:
1、將原來無序的數列,轉化成堆序列(建初識堆的過程);
2、輸出堆頂元素並調整建新堆的過程;
資料結構虛擬碼:
typeof SqList HeapType;void HeapAdjuistI(HeapType &H, int s , int m) { rc = H.r(s); for(j = 2*s;j<=m;j*=2){//沿key較大的孩子節點向下篩選 if(j<m && LT(H.r[j].key,H.r[j+1].key) ){ ++j; } if(LT(rc.key,H.r[j].key) )break; else{ H.r[s] = H.r[j]; s=j; } } H.r[s] = rc;}void HeapSort(HeapType &H ) { for(i = H.length/2;i>0;--i) { HeapAdjust(H,i,H.length); } for(i = H.length;i>1;--i) { H.r[1] <> H.r[i]; HeapAdjust(H, 1, i-1); }}
C語言代碼:
//建堆的方法void HeapAdjust (int array[], int s, int length){ int j; for(;2*s +1<length-1;s = j) { j = 2*s +1; if(j<length-1 && array[j+1] > array[j]) j++; if(array[s] < array[j]) { int temp = array[s]; array[s] = array[j]; array[j] = temp; }else break; int a; for(a =0;a<10;a++) { printf("#%d ",array[a]); } printf("******************************\n"); }}//堆排序void HeapSprt(int array[],int length){ int i; for(i = length/2-1;i>=0;i--) { HeapAdjust(array,i,length); } for(i = length -1;i>=0;i--) { int temp; temp = array[0]; array[0] = array[i]; array[i] = temp; HeapAdjust(array,0,i); }}int main(){ int i; int num[]={9,8,7,6,5,4,3,2,11,0}; HeapSprt(num,sizeof(num)/sizeof(int)); for(i=0;i<sizeof(num)/sizeof(int);i++) { printf("%d ",num[i]); } printf("\nok\n"); return 0;}時間效率:O(nlog2n);
空間效率:O(1);
穩定性:不穩定;