重溫演算法導論(六) 堆排序

2021-08-21 05:45:47 字數 1961 閱讀 4485

堆排序,思想就是先建立最大堆,然後從最大堆中取出最大數,作為陣列的最後乙個資料,重複並把資料取完。

排序的陣列結構,包含堆陣列的長度,有效的堆大小 和堆資料

a
每個節點對應的父節點,左子節點,右子節點

維護最大堆的性質,先假定先假定left[i] 和right[i] 為最大堆,maxheapify(a,2)過程

實現偽**:

maxheapify(a, i)	//先假定left[i] 和right[i] 為最大堆

l = left(i)

r = right(i)

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

largest = l

else

largest = i

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

largest = r

if largest != i

exchange a[i] <=> a[largest]

maxheapify(a, largest)

建立最大堆,從下往上實現子堆最大堆,

前提定理:

過程:

偽**如下

builemaxheap(a)

a.heap-size = a.length

for i = (a.length /2) downto 1

maxheapify(a, i)

堆排序,從最後乙個資料與第乙個資料交換,並減少堆的有效大小,過程如下

偽**如下:

heapsort(a) 堆排序

builemaxheap(a)

for i = a.length downto 2

exchange a[1] , a[i]

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

maxheapify(a, 1)

以下為c++實現**:

//堆排序

templatestruct stua ;

inline int parent(int i)

inline int left(int i)

inline int right(int i)

//假定left 和right 子樹都是最大堆

templatevoid maxheapify(stuastu, int i)

}templatevoid buildmaxheap(stuastu)

}templatevoid heapsort(stuastu)

}

int main(int argc, char* argv)

; int idata[10] = ;

stuaobja;

obja.a = idata;

obja.iheapsize = obja.ilenth = 10;

//buildmaxheap(obja);

heapsort(obja);

}

演算法導論 6 堆排序

堆的分類 最大堆性質 高度 對於堆的一些基本操作 偽 描述 實現 max heapify python實現 123 4567 891011 1213 def max heapify i print max heapify i l left i r right i if l heap size and...

排序演算法(六) 堆排序

堆定義 堆是一種完全二叉樹,每個結點都大於等於其子結點的稱為大頂堆,每個結點都小於等於其子結點的稱為小頂堆。堆排序定義 將待排序的序列構造成乙個大頂堆,此時堆頂是最大值,將其移到序列最末端後,剩餘的序列重新構造乙個大頂堆,如此反覆直到得到乙個有序序列。時間複雜度 o nlogn 實現 public ...

演算法導論之五堆排序

堆排序的時間複雜度是,與插入排序相似,堆也具有空間原址性,即任何時候都只需要常數個額外的元素空間儲存臨時資料。1.堆簡介 1 堆是乙個陣列,表示堆的陣列a包括兩個屬性 a.length表示陣列元素的個數,a.heap size表示有多少個堆元素儲存在該陣列中。給定一結點的下標i,可以得到其父結點 左...