1. 程式人生 > >排序演算法4---堆排序

排序演算法4---堆排序

堆排序

基本思想: 大堆對應升序序列,小堆對應降序佇列,我們從最後一個非葉子結點建堆,步驟如下:
⑴ 將堆頂元素與當前最大堆的最後一個節點交換
⑵ 最大堆節點-1,即調整剩下的n-1個節點
⑶ 從堆頂繼續向下調整,試之滿足最大堆,迴圈⑴和⑵ ,直至剩下一個節點。
時間複雜度: NlogN
穩 定 性 :不穩定
適用場景:topK等問題

void AdjustDown(int *arr, int root, int size)//建大堆
{
 int parent = root;
 int child = parent * 2 + 1;
 while (child < size)
{ //保證child指向較大節點 if (child + 1 < size && arr[child + 1] > arr[child]) child += 1; if (arr[child] > arr[parent]) { std::swap(arr[child], arr[parent]); parent = child;//下濾 child = parent * 2 + 1; } else break; } } //堆排序遞迴 void HeapSort(int *arr,
int size) { assert(arr && size > 1); //從最後一個非葉子節點建堆 for (int idx = (size - 2) / 2; idx >= 0; --idx) { AdjustDown(arr, idx, size);//下濾調整 } int end = size - 1; while (end > 0) { //堆頂與最後一個節點交換,升序 std::swap(arr[0], arr[end]); AdjustDown(arr, 0, end);//下濾調整 --end; } }