基本思想:
- 堆排序是利用堆这种数据结构设计的一种排序算法,它是选择排序的一种。通过堆来进行数据选择。
- 堆是一个近似完全二叉树的结构,同时满足的性质:子结点的键值或索引总是小于(或者大于)它的父节点。
- 排升序要建大堆,排降序建小堆。
代码实现:
void Swap(int *a, int *b)
{
int t = *a;
*a = *b;
*b = t;
}
void AdjustDown(int array[], int size, int r)
{
int left = 2 * r + 1;
int right = 2 * r + 2;
if (left >= size)
{
return;
}
int m = left;
if (right < size && array[right] > array[left])
{
m = right;
}
if (array[r] >= array[m])
{
return;
}
Swap(array + r, array + m);
AdjustDown(array, size, m);
}
// 建堆
void CreateHeap(int array[], int size)
{
for (int i = (size - 1 - 1) / 2; i >= 0; i--)
{
AdjustDown(array, size, i);
}
}
// 排序
void HeapSort(int array[], int size)
{
CreateHeap(array, size);
for (int i = 0; i < size; i++)
{
Swap(array, array + size - 1 - i);
AdjustDown(array, size - 1 - i, 0);
}
}
特性总结:
- 堆排序使用堆来选数,效率就高了很多。
- 时间复杂度:O(N*logN)。
- 空间复杂度:O(1)。
- 稳定性:不稳定。
来源:CSDN
作者:Cassie~
链接:https://blog.csdn.net/qq_43239560/article/details/104727023