堆排序
堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為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 開發的磁碟工具,可以選擇不占用系統任何資源模式進行磁碟碎片整理。這樣,玩遊戲,...