再看資料結構書的時候,發現堆排序以前根本不懂,以前理解的不是很深刻,對演算法也是一知半解,
萬一找工作碰到這樣的筆試題或者面試題,豈不是over了!
先梳理一下堆排序的知識吧:
堆排序只需要乙個記錄大小的輔助空間,每個待排序的記錄僅占有乙個儲存空間。
1、堆是完全二叉樹,但不一定是滿二叉樹;
2、因為堆不滿足根節點比左節結點大,比右結點小的性質,所以不是二叉排序樹,更不可能是平衡二叉樹(因為平衡二叉樹首先是二叉排序樹)。
堆分大根堆和小根堆,乙個無序序列第乙個非終端結點是第
n/2(取整數)。
對於乙個從0開始的陣列來說,第乙個非終端結點其對應的陣列下標是n/2 - 1,其中n是陣列長度。
下面看一下從小到大的堆排序**:
#include void swap(int *a,int *b)
//調節第i個元素,建立大根堆
void heapadjust(int array, int i, int length)
}void heapsort(int array, int length)
//輸出從小到大的順序
printf("輸出最終的堆排序結果\n");
for(i = 0; i < length; i ++)
printf("%d\t",array[i]);
printf("\n");
}int main()
; heapsort(array,9);
return 0;
}
調整堆的時候用的是大根堆,那麼輸出結果就是從小到大的排序結果。
堆排序(c語言)
堆排序的基本思想是 將待排序序列構造成乙個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n 1個元素重新構造成乙個堆,這樣會得到n個元素的次小值。如此反覆執行,便能得到乙個有序序列了 構建初始堆 公升序建大堆,降序建小堆 a.給定乙個無序陣列 ...
C語言 堆排序
堆排序是指利用堆這種 資料結構 所設計的一種 排序演算法 它是選擇排序的一種。可以利用 陣列的特點快速定位指定索引的元素。堆分為大頂堆和小頂堆,是 完全二叉樹 大頂堆的要求是每個節點的值都不大於其父節點的值 在對陣列從小到大排序時,需要使用的就是大頂堆,根據大頂堆的要求可知,最大的值一定在堆頂。以 ...
C語言堆排序
給定乙個堆,如果調整為最大堆,從0開始,後面的葉子結點不用調整,即從len 2開始調整 關鍵是乙個調整函式,需要遞迴的向下進行調整 完整 define crt secure no warnings include include void printarray int arr,int len pri...