八大排序(四) 堆排序

2021-08-19 18:50:51 字數 2552 閱讀 1632

堆是具有以下性質的完全二叉樹:

每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆

每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆

如下圖所示:

對堆中的結點按層進行編號,將這種邏輯結構對映到陣列中就是下面這個樣子

以上陣列從邏輯上講就是乙個堆結構,用簡單的公式來描述一下堆的定義就是:

大頂堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]

小頂堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]

堆排序的演算法過程如下(假設有n各元素):

1.先將初始檔案r[0],r[1]……r[n-1]建成乙個大根堆。建堆是不斷調整堆的過程,從最後乙個非葉子結點(n/2-1)開始開始調整,一直到第乙個節點

2.再將關鍵字最大的記錄r[0](即堆頂)和無序區的最後乙個記錄r[n-1]交換,由此得到新的無序區r[0],r[1]……r[n-2]和有序區r[n-1],且滿足r[0],r[1]…r[n-2]≤r[n-1]

3.由於交換後新的根r[0]可能違反堆性質,故應將當前無序區r[0],r[1]……r[n-2]調整為大根堆 。然後再將調整後關鍵字最大的記錄r[0]和該區間的最後乙個記錄r[n-2]交換,由此得到新的無序區r[0],r[1]……r[n-3]和有序區r[n-2],r[n-1],且仍滿足關係r[0],r[1]……r[n-3]≤r[n-2]……r[n-1],同樣要將r[0],r[1]……r[n-3]調整為大根堆。

…… 直到無序區只有乙個元素為止。

可以結合下面的圖更直觀的理解(都是從**排序演算法(三)之堆排序裡扣出來的,原文寫的很棒,所以我直接搬來了,見諒)

首先構造最大堆

1.假設給定無序序列結構如下

2.此時從最後乙個非葉子結點開始(最後乙個非葉子結點 arr.length/2-1=5/2-1=1,也就是下面的值為6結點),從左至右,從下至上進行調整。由於9>6且9>5,所以將9和父節點6兩個節點交換。

3.第二個非葉節點4的兩個子節點的值分別為9和8,由於9>4且9>8,所以將9和父節點4交換。

4.這時,交換導致了子樹[4,5,6]結構混亂,繼續調整,[4,5,6]中6最大,交換4和6。

此時,我們就將乙個無需序列構造成了乙個大頂堆。

然後將堆頂元素與末尾元素進行交換,使末尾元素最大。交換繼續調整堆,再將堆頂元素與末尾元素交換,得到第二大元素。如此反覆進行交換、重建,直到只有乙個元素為止。

1.將堆頂元素9和末尾元素4進行交換

2.重新調整結構,使其滿足最大堆定義

3.再將堆頂元素8與末尾元素5進行交換,得到第二大元素8.

後續過程,繼續進行調整,交換,如此反覆進行,最終使得整個序列有序

根據以上過程,堆排序的**如下

堆排序:

// 堆排序

public

float heapsort(float array)

// 交換堆頂元素和末尾元素,並在交換之後調整堆結構

for (int j = array.length - 1; j > 0; j--)

return

array;

}// 調整堆結構

public

void adjustheap(float array, int i, int length)

if (array[k] > temp) else

array[i] = temp;}}

堆排序的平均時間複雜度是o(nlogn)。

ref:

堆排序**排序演算法(三)之堆排序

八大排序 堆排序

堆排序 利用大頂堆 小頂堆 堆頂記錄的是最大關鍵字 最小關鍵字 這一特性,使得每次從無序中選擇最大記錄 最小記錄 變得簡單。其基本思想為 大頂堆 1 將初始待排序關鍵字序列 r1,r2 rn 構建成大頂堆,此堆為初始的無須區 2 將堆頂元素r 1 與最後乙個元素r n 交換,此時得到新的無序區 r1...

八大排序演算法(4) 堆排序

是對簡單選擇排序的改進,是一種樹形結構的排序。利用堆的特性,快速選擇出序列中的最大最小元素。堆的定義 用樹表示更加直觀 即 父節點 不大於 不小於 其子節點的完全二叉樹。降序時稱為 大堆頂,公升序時稱為 小堆頂。這樣的堆,其堆頂就是整個序列中最大 最小的元素。不斷的取出堆頂 將剩下序列重組成堆的過程...

八大排序之堆排序

public class heapsort heapsort num,num.length for int i 0 i 0 i heapadjust array,i,length 從最後乙個元素開始對序列進行調整,不斷的縮小調整的範圍直到第乙個元素 for i length 1 i 0 i priv...