堆排序演算法的實現

2021-08-28 16:18:03 字數 1117 閱讀 1065

1.實現了乙個大根堆類。為方便呼叫定義成了static靜態類成員函式。沒有資料成員變數。乙個建堆函式,乙個調整函式。 

#include "stdafx.h"

//定義兩個有參巨集來尋找陣列中的數之間的關係

#define left(x) 2 * x + 1;//獲得左節點在陣列中的下標

#define right(x) 2 * (x + 1);//獲得右節點在陣列中的下標

using namespace std;

//大根堆類的實現:包括兩個排序建堆的static函式

class dui

} //假定對某乙個節點i其左,右子樹都是都是最大堆,但是對於節點i和它的左右子節點則可能破壞最大堆的性質,我們來寫乙個函式對這情況下的堆來進行維護使整體的堆滿足最大堆性質

//維護節點i及左右孩子這三個節點的堆性質,並對交換的子節點進行再次維護

static void maxheapify(int* a, int i, int low, int high)

else

if (largest != i)

}//堆排序函式:每次(刪除根節點)交換根與最後乙個節點,維護剩下的節點為新堆,直到i=1時只需交換,不再維護

static void heapsort(int a, int length) }

//int *a;

};

2.heapsort函式才是堆排序函式。按照刪除根節點的辦法,每次把最大數(根)放入到容器(陣列)最後,這樣就從後往前依次輸出有序序列。此函式是堆排序函式,即對乙個具備堆性質的容器或陣列進行排序,輸出乙個遞增或遞減的序列。

3.在本節後面的習題當中有提到這麼乙個問題:為什麼是從length/2-1遞減到0,而不是從0開始遞增到length/2-1呢?從length/2-1遞減到0就意味著,從最後的乙個非葉節點開始「從小到大」地進行維護,保證每乙個點的子樹都是最大堆,可以確保最大堆的性質,而如果從0遞增到length/2-1則無法保證堆的性質,可以看如下反例:

對陣列從0遞增到length/2-1的堆建立過程如下圖所示:

參考:

堆排序演算法實現

include define true 1 define false 0 typedef struct recordtype void sift recordtype r,int k,int m 調整堆 r i t void crt heap recordtype r,int length 建立堆 ...

排序演算法之堆排序演算法的實現

堆排序 利用堆資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為o nlogn 它也是不穩定排序。首先簡單了解下堆結構。堆是具有以下性質的完全二叉樹 每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆 或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂...

排序演算法 之堆排序的實現

includeusing namespace std 1 找到第乙個非葉子節點的位置cur 陣列元素個數size 2 1 2 從cur開始,依次將各子樹調整為最大堆 整體成為最大堆 3 堆頂元素與陣列最後乙個元素交換 4 陣列元素減1,重複執行上述操作 void adjustup int arr,i...