堆排序是一種樹形選擇的排序演算法,在排序過程中將陣列看作是一棵完全二叉樹。但其實它是順序儲存的結構,這裡我們實現的是大根堆的建堆演算法。
(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.實現堆排序時...
堆的實現及堆排序
前兩天刷筆試題,判斷乙個陣列的序列可以構成堆。仔細想了想,腦海裡幾乎已經遺忘了堆的知識,今天又重新去看書,把堆的知識總結一下。首先堆是一種陣列物件,它可以被看成乙個完全二叉樹。在我們常見的堆中有大堆和小堆。對大堆來說,每個父節點都大於孩子結點 小堆恰好相反。而且,大堆 小堆的每個子樹也是乙個大堆 小...