排序演算法4---堆排序
阿新 • • 發佈:2018-11-09
堆排序
基本思想: 大堆對應升序序列,小堆對應降序佇列,我們從最後一個非葉子結點建堆,步驟如下:
⑴ 將堆頂元素與當前最大堆的最後一個節點交換
⑵ 最大堆節點-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;
}
}