堆排序(heapsort)是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。
通常堆是通過一維陣列來實現的。在起始陣列為 0 的情形中:
父節點i的左子節點在位置 (2*i+1);
父節點i的右子節點在位置 (2*i+2);
子節點i的父節點在位置 floor((i-1)/2);
在堆的資料結構中,堆中的最大值總是位於根節點。堆中定義以下幾種操作:
最大堆調整(maxheapify):將堆的末端子節點作調整,使得子節點永遠小於父節點
建立最大堆(buildmaxheap):將堆所有資料重新排序
堆排序(heapsort):移除位在第乙個資料的根節點,並做最大堆調整的遞迴運算
現在給出c#實現的堆排序:
1public
class heapsort: isortwhere t : icomparable217}
18private
void buildmaxheap(t array, int startindex, int
endindex)
1927}28
29//
insert a new root node for two child maxheap.
30private
void maxheapify(t array, int startindex, int endindex, int
newrootindex)
3141
if (r <= endindex && array[r].compareto(array[tmplargestindex]) > 0)42
45if (tmplargestindex !=newrootindex)
4654
}55 }
演算法導論之五堆排序
堆排序的時間複雜度是,與插入排序相似,堆也具有空間原址性,即任何時候都只需要常數個額外的元素空間儲存臨時資料。1.堆簡介 1 堆是乙個陣列,表示堆的陣列a包括兩個屬性 a.length表示陣列元素的個數,a.heap size表示有多少個堆元素儲存在該陣列中。給定一結點的下標i,可以得到其父結點 左...
基礎演算法複雜之五 堆排序
堆排序是不穩定排序,時間複雜度最好,最壞,平均都為o logn 堆排序的基本思想是 先將無序序列按照公升序或者降序需求構造成乙個大頂堆或者小頂堆 將堆頂元素與末尾元素交換,然後重使最大元素沉到陣列末端 重新調整堆使其成為大頂堆,繼續交換堆頂元素和末尾元素,反覆執行交換 調整,知道整個序列有序 其中,...
整理排序演算法(五) 堆排序
堆排序 大頂堆 將記錄看成乙個順序儲存的二叉樹 先構建大頂堆,所有節點都比他的兒子大或者等於。第一步 從最後乙個非葉子節點開始比較,一直到根。構建大頂堆成功。第二步 根與最後的葉子節點交換位置 第三步 除去剛才的葉子節點,再次構建大頂堆,這個時候構建大頂堆只要從上往下層級遍歷就好。演算法效能 堆排序...