堆排序,思想就是先建立最大堆,然後從最大堆中取出最大數,作為陣列的最後乙個資料,重複並把資料取完。
排序的陣列結構,包含堆陣列的長度,有效的堆大小 和堆資料
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,可以得到其父結點 左...