堆排序的實現 建堆 調整 排序

2021-09-11 18:13:22 字數 961 閱讀 2853

堆排序是一種樹形選擇的排序演算法,在排序過程中將陣列看作是一棵完全二叉樹。但其實它是順序儲存的結構,這裡我們實現的是大根堆的建堆演算法。

(1)大根堆(堆頂元素大於或等於其對應的子節點)

(2)小根堆(堆頂元素小於或等於其對應的子節點)

一、構建初始大根堆

構建大頂堆的過程就是乙個反覆篩選的過程,從第乙個非葉子結點開始,呼叫調整篩選的演算法,逐步向上進行調整,直至堆頂元素。

調整演算法:使用a[0]來暫存需要調整的元素值,從該節點的左孩子節點出發,比較左孩子結點與右孩子結點的值大小,選出值較大的結點。若該節點小於父節點的值,則不用進行調整;若該節點大於父節點的值,則將其值賦值給父節點,調整結點的下標值。在這一過程中,由於交換後可能會破壞掉剛建好的子堆,因此,需要使用迴圈,依次檢查其子堆是否還滿足大頂堆。i=i*2

實現**:

//堆排序

//建堆過程

#includeusing namespace std;

typedef int elemtype;

void build_heap(elemtype a,int len);

void adjustdown(elemtype a,int k,int len);

void heap_sort(elemtype a,int len);

void build_heap(elemtype a,int len)

}void adjustdown(elemtype a,int k,int len)

} a[k]=a[0];

}void heap_sort(elemtype a,int len)

}int main();//注意在這裡a[0]是暫存元素的,所以輸入的時候存放乙個0值

heap_sort(a,7);

for(int j=1;j<=7;j++){

cout《需要注意的是:這裡我們使用了a[0]來暫存需要調整的元素,所以a[0]的值我們賦予其為0 

建堆以及堆排序 C

1 建立最小堆,從小到大排序 時間複雜度為o nlogn include int h 100 int n void swap int x,int y 向下調整成最小堆 void siftdown int i int deletemin int main 2 建立最大堆,從小到大排序,最大元素在h 1...

堆以及堆排序實現

1.今天實現了一下堆排序,這裡的堆是指二叉堆,至於二項堆和斐波那契堆以後再說。先看二叉堆的定義 二叉堆是完全二叉樹或近似完全二叉樹。滿足特性是 父親節點的值大於等於 小於等於 左右孩子的值,並且左右子樹也是二叉堆。對應的二叉堆是大頂堆 小頂堆 二叉堆是完全二叉樹,可以用線性表來儲存。2.實現堆排序時...

堆的實現及堆排序

前兩天刷筆試題,判斷乙個陣列的序列可以構成堆。仔細想了想,腦海裡幾乎已經遺忘了堆的知識,今天又重新去看書,把堆的知識總結一下。首先堆是一種陣列物件,它可以被看成乙個完全二叉樹。在我們常見的堆中有大堆和小堆。對大堆來說,每個父節點都大於孩子結點 小堆恰好相反。而且,大堆 小堆的每個子樹也是乙個大堆 小...