對資料結構和演算法的總結和思考(五) 堆排序

2021-08-09 20:26:29 字數 1959 閱讀 2376

本篇分享的內容為堆排序,提到堆排序就不得不提一下堆這個資料結構。 堆實際上是一棵完全二叉樹,因此其任何一非葉節點滿足性質:

key[i]<=key[2i+1]&&key[i]<=key[2i+2]或者key[i]>=key[2i+1]&&key>=key[2i+2]

即任何一非葉節點的關鍵字不大於或者不小於其左右孩子節點的關鍵字。

堆分為大頂堆和小頂堆,滿足key[i]>=key[2i+1]&&key>=key[2i+2]稱為大頂堆,滿足 key[i]<=key[2i+1]&&key[i]<=key[2i+2]稱為小頂堆。由上述性質可知大頂堆的堆頂的關鍵字肯定是所有關鍵字中最大的,小頂堆的堆頂的關鍵字是所有關鍵字中最小的。

function heapify(arr, i, len) 

if (len > right && arr[right] > arr[max])

if (max !== i)

//經過這樣一輪之後,就構建了乙個完整的雙親和孩子結構。

return arr;

} // 建堆

let len = arr.length;

for (let i = parseint(len / 2) - 1; i >= 0 ; i --)

上面的**我都有詳盡的注釋,有一點必須要注意,就是建大頂堆必須從下往上建,這樣才能保證堆頂為最大值,也就是let i = parseint(len / 2) - 1;為什麼i要為parseint(len / 2) - 1;這也是有道理的,因為完全二叉樹的有這麼兩個性質:

性質1:在二叉樹的第i層上至多有2^(i-1)個結點

性質2:深度為k的二叉樹最多有2^k - 1個結點

也就是說最下層元素為總元素個數加一然後除二。具體為什麼,可以從以2為指數的等比數列求和得知,這裡就不一一展開。當然我這裡講的是滿二叉樹的情況,額,滿二叉樹就是完全二叉樹的一種特殊情況。算了,具體概念這裡就不深究了,以後再一一講明。現在建好了大頂堆,那就開始關鍵性的步驟–堆排序。

堆排序的核心思想是:

1)將初始待排序關鍵字序列(r1,r2….rn)構建成大頂堆,此堆為初始的無序區;

2)將堆頂元素r[1]與最後乙個元素r[n]交換,此時得到新的無序區(r1,r2,……rn-1)和新的有序區(rn),且滿足r[1,2…n-1]<=r[n];

3)由於交換後新的堆頂r[1]可能違反堆的性質,因此需要對當前無序區(r1,r2,……rn-1)調整為新堆,然後再次將r[1]與無序區最後乙個元素交換,得到新的無序區(r1,r2….rn-2)和新的有序區(rn-1,rn)。不斷重複此過程直到有序區的元素個數為n-1,則整個排序過程完成。

**如下:

for (let j = len - 1; j >= 0; j --)
是不是很簡單,是不是很清晰,好了,堆排序就是這樣簡單明瞭清晰,**合在一起如下所示:

// var swap = require('./swap.js');

function

swap

(arr, i, j)

count = 0;

function

heap

(arr)

for (let j = len - 1; j >= 0; j --)

return arr;

}function

heapify

(arr, i, len)

if (len > right && arr[right] > arr[max])

if (max !== i)

//經過這樣一輪之後,就構建了乙個完整的雙親和孩子結構。

return arr;

}var arr=[91,60,96,13,35,63,324,223,23,44,22,90, 25,45];

console.log(heap(arr));

console.log(count);

對資料結構和演算法的總結和思考(一) 概覽

前段時間陸續看了各種排序演算法和查詢演算法,覺得不過癮,很多東西不系統,所以網上找了一本書程杰的 大話資料結構 這段時間認真學習了全本內容,收穫頗多,想著就總結一下這段時間所學,所思,權當給大家乙個借鑑吧。先從排序演算法說起現在流行的排序演算法如果按型別分大致分為五大類 選擇排序類 插入排序類 交換...

對資料結構和演算法的總結和思考(三) 希爾排序

希爾排序是第乙個時間複雜度突破o n 2 的高階演算法。顧名思義,這就是被希爾發現的一種排序演算法。演算法本質為分組插入排序。具體實現為 let count 0 function shellsort arr for gap gap 0 gap math.floor gap times arr fla...

對資料結構和演算法的總結和思考(七) 二分查詢

說起查詢演算法,二分查詢是肯定不能少的,當然鵝廠有些猿喜歡叫他歐巴馬查詢 二分查詢的時間複雜度為o logn 不線性查詢的時間複雜度o n 更優秀。核心思想 是將n個元素分成大致相等的兩部分,取a n 2 與x做比較,如果x a n 2 則找到x,演算法中止 如果x function binary ...