前言
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是
通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。
堆排序
- 堆排序使用堆来选数,效率就高了很多。
- 时间复杂度:O(N*logN)
- 空间复杂度:O(1)
- 稳定性:不稳定
void AdjustDownB(int* a,int n,int parent)
{
int child = (parent-1)/2;
while(child < n)
{
//选出较大的一个孩子
if(child + 1 < n && a[child] < a[child+1])
{
child++;
}
if(a[child] > a[parent])
{
swap(&a[cihld],&a[parent]);
parent = child;
child = (parent-1)/2;
}
else
{
break;
}
}
}
void HeapSort(int* a,int n)
{
for(int i = (n-1-1)/2;i >= 0;i--)
{
//时间复杂度O(N)
/*那么总的时间计算为:s = 2 ^ (i - 1) * (k - i);其中 i 表示第几层,2 ^ (i - 1) 表示该层上有多少个元素,(k - i) 表示子树上要下调比较的次数。
S = 2 ^ (k - 2) * 1 + 2 ^ (k - 3)2….. + 2(k - 2) + 2 ^ (0) * (k - 1) == = > 因为叶子层不用交换,所以i从 k - 1 开始到 1;
S = 2 ^ k - k - 1;又因为k为完全二叉树的深度,而log(n) = k,把此式带入;
得到:S = n - log(n) - 1,所以时间复杂度为:O(n)*/
AdjustDownB(a,n,i);
}
for(int end = n - 1;end > 0;end--)
{
swap(&a[0],&a[end]);
AdjustDown(a,end,0);
}
}
更详细看数据结构–堆