這幾天有點牴觸情緒,看過了快速排序還有一些別的東西,但是一點都不想寫有點複雜的**0 0拖到了今天終於寫了前幾天就應該自己寫一下的堆排序,完全用c語言寫的,下面把**貼一下。很多地方寫得並不好,不過已經經過了測試,可以正確執行。
1/*堆排序*/2
void percolatedown(int* a, int i, int n)//
下濾操作314
else
if(lc < n)//
僅有左孩子(只有最後乙個內部節點可能會這種情況)
1522}23
else
24break;25
}26}27
void buildheap(int* a, int n)//
將陣列就地建堆
2832
int delmax(int* a,int n)//
刪除最大元素,呼叫者自行更改規模
3339
void heapsort(int* a, int n)//
堆排序主演算法
4047 }
建堆是最為關鍵的環節,可以說堆建好了才能開始進行排序。這裡為了保持高效,建堆採用的是floyd就地建堆演算法,就是從原陣列最後乙個內部節點的位置進行下濾操作,當下濾到外部節點或x,x->lc,x->rc節點中最大的就是x節點時,下濾結束,繼續進行下乙個節點的下濾。每次交換元素後,新的堆頂並不是乙個合格的堆頂,因此需要對堆頂繼續進行下濾操作,不過注意到,只有堆頂乙個節點是不合適的,所以重新建堆的操作複雜度不超過o(logn),即堆的高度。
後面可能還會寫乙個k-選取的問題,即選取陣列中第k大的元素,或者選取前k大的元素這種問題。基於優先順序佇列的方法,是乙個可行的解,不過最壞情況的複雜度並不讓人滿意。
c 堆排序的實現
今天重溫了一下各大排序。打算寫一下堆排序,首先要了解它能幹什麼,有什麼區別,定位,怎麼實現 1.能幹什麼 對資料進行排序。廢話了 2.和別的排序有什麼區別 比插入,冒泡,選擇排序效率高,但是在效能低於快排,它屬於不穩定排序 3.定位 適合於大量的資料的排序。時間複雜度為o nlgn 即使在最好和最差...
堆排序(C 的實現)
includeusing namespace std 堆排序演算法的步驟 1 把無序陣列構建成二叉堆。需要從小到大排序,則構建成最大堆 否則,構建成最小堆。2 迴圈刪除堆頂元素,替換到二叉堆的末尾,調整堆產生新的堆頂。下沉 調整 void downadjust int array,int paren...
c 實現堆排序
include include include using namespace std 對比枝節點和左右子節點,將比較大的節點放置於枝節點 template int heapadjust t t,int i,int size if rightchild size t rightchild t max...