堆排序
基本思想:減治演算法。通過堆來選擇資料,其中排公升序建大堆,排降序建小堆首先,在這裡簡單介紹一下二叉堆的概念:二叉堆在邏輯上可視為完全二叉樹,在物理上可視為陣列,本質上是對於任意乙個結點,要求根的值 >=(針對大堆) 所有的子樹結點的值,其基本作用是找最值
堆排序主要分為以下三部分:
1.向下調整
2.建堆
3.堆排序
**實現:
1.建堆
void
createheap
(int
array)
}
2.向下調整 / 堆化
void
heapify1
(int
array ,
int size ,
int index)
while(2
+ index +
1< size)
//3.比較雙親的值和最大孩子的值,如果雙親大,停止;否則交換兩者的值,並以新結點開始繼續向下調整
if(array[max]
> array[index]
)else}}
void
heapify2
(int
array ,
int index)
//2.找最大孩子
if(right < array.length && array[right]
> array[left]
)//3.比較雙親和孩子結點
if(array[index]
>= array[max]
)//孩子大,交換
swap
(array , index , max)
;//4.繼續向下調整
heapify1
(array , max)
;}
3.堆排序
void
heapsort
(int
array)
}
堆排序特性總結:
堆排序使用堆來找最值,效率較高
排公升序建大堆,排降序建小堆
時間複雜度:最好、最壞、平均都是o(n*log(n))
空間複雜度:o(1)
穩定性:不穩定
資料結構 五 堆排序
1 演算法流程 1 對原始資料構建大根堆 a 從下至上,遍歷每個非葉子父節點,保證每個非葉子父節點都比它的左右子節點來的大,非葉子父節點的對應索引範圍為 0,n 2 1 b 在遍歷每個非葉子父節點的時候,如果發生該節點交換 下沉 那麼要遞迴下去 2 交換大根堆構建後的陣列的首個元素與末尾元素,這時候...
資料結構之排序(六) 堆排序
堆是具有下列性質的完全二叉樹 每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆,如左圖 或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆,如右圖。堆排序 heap sort 就是利用堆 假設利用大頂堆 進行排序的方法。它的基本思想是,將帶排序的序列構造成乙個大頂堆。此時,整個序列的最...
資料結構經典排序 堆排序
堆排序思想 以大頂堆為例 1 先建初始堆,從第乙個非葉子節點開始調整堆為乙個大頂堆,直到整個待排序列成為乙個大頂堆 2 將堆頂元素與堆中的最後乙個元素交換 3 將堆中的最後乙個元素移除堆 4 再次調整待排序列為乙個大頂堆,從堆中的根節點開始比較,比較該節點的左右子節點,將較大的節點值與根節點的值比較...