堆排序的C實現

2022-08-28 18:51:06 字數 863 閱讀 6458

這幾天有點牴觸情緒,看過了快速排序還有一些別的東西,但是一點都不想寫有點複雜的**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...