簡單易懂的講堆排序

2021-08-07 22:55:41 字數 1315 閱讀 5866

堆排序利用二叉堆來進行排序,而二叉堆用完全二叉樹代替(因為易於儲存和索引),乙個陣列就可以儲存完全二叉樹。(๑╹◡╹)ノ"""

但堆並不一定是完全二叉樹,堆還有更複雜的,就不一一枚舉;

怎麼用陣列儲存呢?對於每乙個節點i,其父節點為i/2,其左右子節點分別為i*2,i*2+1;如圖:

怎麼進行排序呢,我們分為兩個大步驟:

1,構建乙個最大堆(每乙個父節點都大於其子節點)

對於每乙個非葉子節點(有葉子的節點),如果其小於子節點,那麼就與子節點中較大的進行交換;

對於乙個節點數為n的二叉堆來說,最後乙個非葉子節點為n/2;

所有的父節點都大於其子節點,最大堆構建完成;

2,從最後乙個元素開始到第乙個元素進行如下操作:

(1)交換當前元素與第乙個元素(根據最大堆性質,第乙個元素最大);

(2)然後忽視被交換到後面的元素並重構最大堆

(1)最後乙個元素編號為6,值為3與第乙個元素進行交換:

(2)交換一次後可以看到6已經到達了位置,即6已經排好了序;

排除6重新構建最大堆:

(1)交換倒數第二個元素和第乙個元素:

第二個元素到達位置,即5,6已經排好序

(2)忽略5,6並重構最大堆。。。。。。。。

這樣一直到排好序,即每一次都有乙個元素排好序,每次找堆頂元素(除去已排好序的元素中最大的數)並將其放到其應該待的位置;

完整**:

#includeusing namespace std;

void sift(int *r,int low,int high)

for(i=n;i>=2;i--)

} int main();

heapsort(a,6);

for(int i=1;i<=6;i++)cout<

最簡單易懂的堆排序

堆排序 a 堆排序是一種原地的 時間複雜度為o nlogn 的排序演算法.b 如何理解 堆 堆是一種特殊的樹 堆是乙個完全二叉樹 堆中每乙個節點的值都必須大於等於 或小於等於 其子樹中每個節點的值。對於每個節點的值都大於等於子樹中每個節點值的堆,我們叫做 大頂堆 對於每個節點的值都小於等於子樹中每個...

堆排序詳講

堆排序的時間,主要由建立初始堆和反覆重建堆這兩部分的時間開銷構成,它們均是通過呼叫heapify實現的 o n logn 排序 heapsort 是指利用堆積樹 堆 這種資料結構所設計的一種排序演算法,它是選擇排序的一種。可以利用陣列的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二叉樹。...

簡單的堆排序

堆排序的是先建立乙個完全二叉樹,之後調整成乙個大頂堆,再進行堆調整的過程!include include 時間函式 include using namespace std int h 101 用來存放堆的陣列 int n 用來儲存堆中元素的個數,也就是堆的大小 void swap int x,int...