演算法導論之堆排序相關

2021-07-11 22:41:45 字數 1976 閱讀 1302

堆排序文件

二叉堆分為兩種:最大堆、最小堆

最大堆:最大元素在根部,在堆的所有結點中,a[patent(i)]>=a[i]

最小堆:最小元素在根部,在堆的所有結點中,a[patent(i)]<=a[i]

下面以最大堆為例解釋堆排序的具體過程:

首先會用到幾個基本的函式:

parent(i)

return ⌊i/2⌋

left(i)

return 2i

right(i)

return 2i+1

這是三個基本函式,分別求的是二叉堆中第i個元素的父節點,左孩子結點和右孩子結點的標號

函式max-heapfy(a,i)是用來維護最大堆的基本性質,即就是(最大元素在根部,在堆的所有結點中,a[patent(i)]>=a[i]),函式的實現原理就是比較結點i的本身的值和此結點的左右子樹的結點的值,將最大的值賦給結點i,即雙親結點。若是發生了變化,即就是原本最大的並不是根節點,後來進行了變換才將最大的值賦給了根節點,此時就要繼續進行此操作,一直往下處理,直到不再發生變換時結束。函式max-heapfy(a,i)中,a代表的是存放資料的陣列,i表示的要處理的結點的序號。

函式max-heapfy(a,i)的偽**如下:

max-heapfy(a,i):

l=left(i);

r=right(i);

if l<=a.heap-size && a[l]>a[i]

largest=l;

else largest=i;

if r<=a.heap-size && a[r]>a[largest]

largest=r;

if largest!=i

exchange a[i] with a[largest]

max-heapfy(a,largest)

其中,a.heap-size指的是陣列a的有效的元素的個數(此函式的作用是,在乙個元素的排列順序滿足堆的性質的陣列中,變換了其中乙個元素的位置,使得陣列不再滿足堆的性質的條件時,進行調整,使陣列重新變得有序)

上面地函式max-heapfy(a,i)相當於建立了乙個優先佇列,下面要進行建堆:

用函式build-max-heap(a)來實施建堆,此函式的本質是不斷地呼叫函式max-heapfy(a,i),

對調換了第乙個和最後乙個元素的陣列中元素的位置進行重新整理,使得元素之間滿足堆的結構(注意堆的結構並不是按照從大到小的順序從前到後進行排列)。

函式build-max-heap(a)的偽**如下:

build-max-heap(a):

a.heap-size=a.length;

for i=⌊a.length/2⌋ downto 1

max-heapfy(a,i);

此函式執行完畢,存放原始資料的陣列裡的元素就按照最大堆的順序排列好了,現在可以開始進行堆排序了

堆排序演算法:基於前面的基礎工作之上,堆排序演算法的實現就變得很簡單了,即就是首先建堆,然後將第乙個元素和最後乙個元素的位置互換,就得到了第乙個元素,將它從原來的陣列中單獨拿出來,接著呼叫函式max-heapfy(a,i)來使堆維持其特性,再互換第乙個元素和最後乙個元素,就又可以得到乙個新的元素,一直執行此操作,直到拿到了所有的元素。

堆排序演算法的偽**如下:

heapsort(a):

buile-max-heap(a)

for i=a.length downto 2

exchange a[1] with a[i]

a.heap-size=a.heap-size-1;

max-heapfy(a,1)

堆排序演算法heapsort(a)的時間複雜度為o(nlgn),(效能最差的排序演算法,例如冒泡和選擇排序,他們的時間複雜度都是o(n*n))

由於快排的效能一般要優於堆排序,所以,與快排相比較,堆排序更大的用處體現在優先佇列上。包含最大優先佇列和最小優先佇列。最大優先佇列經常用於類似於作業系統中的共享計算機系統的作業排程;而最小優先佇列經常用於基於事件驅動的模擬器。

演算法導論之堆排序

堆排序主要是先建堆,轉化為最大堆,每次把最大的乙個 即最大堆的根節點 和最後乙個交換,這樣每次都把當前最大的乙個放到了最後。堆排序演算法中,最關鍵的就是構造初始堆。需要編寫乙個維護大頂堆性質的函式max heapify。當輸入乙個陣列l和乙個下標i,然後呼叫max heapify時,比較l i l ...

演算法導論之堆排序

二叉 堆,是乙個陣列,可以被看成乙個近似的完全二叉樹,樹上的每乙個節點對應於陣列中的乙個元素。除了最底層之外,該樹是完全充滿的,而且是從左向右填充,a.length表示陣列元素的個數,樹的根結點是a 1 這樣給定乙個節點的下標i,我們很容易計算出其父節點 i 2 左子女 2 i 右子女 2 i 1 ...

演算法導論筆記之堆排序

堆排序 時間複雜度nlgn 堆是一種特殊的二叉樹,最大堆 根節點的key大於其兩個孩子節點鍵值,依次類推,所以最大值為根,最小值在葉子節點處 ita定義堆的陣列表示法為1 10,所以a 0 暫用無處,比如,長度為10的堆,則用a 1 a 10 表示,建立時的長度要比實際長度多1 幾個常見操作 hea...