堆排序利用二叉堆來進行排序,而二叉堆用完全二叉樹代替(因為易於儲存和索引),乙個陣列就可以儲存完全二叉樹。(๑╹◡╹)ノ"""
但堆並不一定是完全二叉樹,堆還有更複雜的,就不一一枚舉;
怎麼用陣列儲存呢?對於每乙個節點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...