堆排序
特点:
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据
重点!
排升序要建大堆,排降序建小堆
(升序)从小到大(降序)从大到小
1.建立小堆
void HeapBuilt(int* a, int n, int i)//建小堆
{
int parent = i;
int child = parent * 2 + 1;
while (child < n)
{
//如果左子树比较小,并且child+1没有越界,child++
if (child + 1 < n && a[child + 1] < a[child])
child++;
//如果子节点小于父节点,交换父子节点,并重新定义父子节点。
if (a[child] < a[parent])
{
int tmp = a[parent];
a[parent] = a[child];
a[child] = tmp;
parent = child;
child = parent * 2 + 1;
}
else
break;
}
}
2.堆排序
void HeapSort1(int* a, int n)
{
//从下向上初步建设堆。
for (int i = (n - 2) / 2; i >= 0; i--)
{
HeapBuilt(a, n, i);
}
int end = n - 1;
//选数,最后一个数和第一个数做交换,将最后一个数从数组中剔除,重新进行堆排。
while (end > 0)
{
int tmp = a[0];
a[0] = a[end];
a[end] = tmp;
HeapBuilt(a, end, 0);
end--;
}
}
代码结果:
堆排序特点
1.时间复杂度:O(N*logN)
2.空间复杂度:O(1)
3.稳定性:不稳定