演算法設計之 世界上最好理解的堆排序

2021-10-14 18:27:34 字數 2504 閱讀 6369

堆排序

堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為o(nlogn),它也是不穩定排序。首先簡單了解下堆結構。

堆堆是具有以下性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆。如下圖:

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

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

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

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

堆排序的基本思想:

將待排序序列構造成乙個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n-1個元素重新構造成乙個堆,這樣會得到n-1個元素的次小值。如此反覆執行,便能得到乙個有序序列了.

接下來搞個例子:

如下圖

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

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

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

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

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

接下來將剩下的部分最大頂化,得到如下

然後將5和8交換得到如下

如法炮製得到如下:

**實現:

//交換陣列a,i位置和j位置的元素

void

swap

(int a,

int i,

int j)

//構建i位置元素的大頂堆

void

adjustmaxheap

(int a,

int i,

int nlen)

if(a[ncur]

&& nright

if(ncur != i)

}//構建陣列a為大頂堆,從樹的最後乙個非葉子節點開始,從左至右,從下往上。

void

adjust

(int a,

int nlen)

}void

heapsort

(int a,

int nlen)

}void

main()

;int nalen =

sizeof

(a)/

sizeof

(a[0])

;heapsort

(a, nalen)

;for

(auto node :a)

cout << endl;

int b=

;int nblen =

sizeof

(b)/

sizeof

(b[0])

;heapsort

(b, nblen)

;for

(auto nodex : b)

cout << endl;

system

("pause");

}

PHP是世界上最好的語言

if eregi hackerdj get id get id urldecode get id 一次解碼 if get id hackerdj can you authenticate to this website?urlencode編碼主要用於將字串以url編碼,返回乙個字串 urldecod...

世界上最好的中文名字是什麼

其實斯澤夫這名字很好聽,有中國味道,叫著也很上口,如果深入一下,有很多意思可以發掘出來。2009 10 03 中國人到美國,常常有乙個安妮 傑克之類的洋名字,不是為了好聽,也是為了方便。老外來到中國,同樣也有不少附庸風雅,取乙個中文名字來聽聽,尤其是常駐中國的外交官 企業家等上層人物。例如美國的駐華...

世界上最好的磁碟碎片整理工具 O O Defrag

最新版,而且帶完全漢化和序號產生器!用過所有現在流行的磁碟碎片整理工具 用下來這款是最好的!而且效率很高。整理完畢以後重啟電腦後程式開啟或者檔案開啟比新裝系統還要快!o o defrag 是一款專為 nt 2000 xp 開發的磁碟工具,可以選擇不占用系統任何資源模式進行磁碟碎片整理。這樣,玩遊戲,...