排序演算法之堆排序 8

2021-10-18 01:21:20 字數 2161 閱讀 9524

說明:堆排序是樹結構的乙個實際應用,我們在學習堆排序時,一定要對樹有所了解。

1)將待排序序列構造成乙個大頂堆

2)此時,整個序列的最大值就是堆頂的根節點。

3)將其與末尾元素進行交換,此時末尾就為最大值。

4)然後將剩餘n-1個元素重新構造成乙個堆,這樣會得到n個元素的次小值。如此反覆執行,便能得到乙個有序序列了。

構造初始堆。將給定無序序列構造成乙個大頂堆(一般公升序採用大頂堆,降序採用小頂堆)。

原始的陣列 [4, 6, 8, 5, 9]

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

.此時我們從最後乙個非葉子結點開始(葉結點自然不用調整,第乙個非葉子結點 arr.length/2-1=5/2-1=1,也就是下面的 6 結點),從左至右,從下至上進行調整。

找到第二個非葉節點 4,由於[4,9,8]中 9 元素最大,4 和 9 交換。

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

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

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

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

.重新調整結構,使其繼續滿足堆定義

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

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

// 2.將堆頂元素與末尾元素進行交換,將最大元素沉到末尾

// 3.重新調整結構,使其滿足堆定義,然後繼續交換堆頂元素與當前末尾元素,反覆執行調整+交換步驟, 直到整個序列有序。

for(

int j = arr.length -

1; j >

0; j--)}

/** *

* @description: 完成 將以i對應的非葉子節點的樹調整成大頂堆

* @param @param arr 待調整的陣列

* @param @param i 表示非葉子節點在陣列中的索引

* @param @param length 表示堆多少個元素繼續調整,每調整一次length-1

* @return void

*/public

static

void

adjustheap

(int

arr,

int i,

int length)

if(arr[k]

> temp)

else

}// 當for迴圈結束之後,我們已經將以i為父節點的數的最大值,放到了最頂

arr[i]

= temp;

}}

排序演算法之堆排序

前言 今天我來介紹下堆排序,在寫堆排序 之前,我們要知道堆的概念!堆的定義 n個關鍵字序列kl,k2,kn稱為 heap 當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k 2i 且ki k 2i 1 1 i n 當然,這是小根堆,大根堆則換成 號。k i 相當於二叉樹的非葉子結點,k 2i 則...

排序演算法之堆排序

堆排序演算法是選擇排序的一種,該演算法只是通過堆,最大堆 或者最小堆選擇出乙個待排序序列中的最大值,或者最小值。要想實現堆排序演算法,就需要構建什麼堆,這裡也最小堆為例。說明什麼是堆,怎麼構建乙個堆。假設待排序序列為a n 為乙個陣列。陣列的長度為n 陣列下標為 0,1,2,i,2i,2i 1 n ...

排序演算法之堆排序

宣告 本博文 為樓主親自編寫並測試,其它內容引用至我一直很崇拜的牛人morewindows。他對排序演算法的講解通俗易懂,給人一種耳目一新的感覺。堆排序與快速排序 歸併排序 一樣都是時間複雜度為o n logn 的幾種常見排序方法。最小堆的講解以及最小堆元素的插入和刪除參見最小堆操作。以下繼續引用以...