前言
这次博客将要详细讲解堆排序以及采用等比数列来求解它的时间复杂度,以及使用堆排序解决TOP-K问题
堆排序
前面我们已经讲了堆这种数据结构,以及实现它的向下调整法和向上调整法。
接下来,我们使用他们来实现堆排序
如何实现堆排序呢?我们看图说话
这里就看看代码吧
//向上调整
void AdjustUp(HPDataType* a, int child)
{
int parent = (child - 1) / 2;
while (child > 0)
{
if (a[child] < a[parent])
{
Swap(&a[child], &a[parent]);
child = parent;
parent = (child - 1) / 2;
}
else
break;
}
}
//向下调整
void AdjustDown(HPDataType* a, int size, int parent)
{
int child = parent * 2 + 1;
while (child < size)
{
if (child + 1 < size && a[child + 1] < a[child])
child++;
if (a[child] < a[parent])
{
Swap(&a[child], &a[parent]);
parent = child;
child = parent * 2 + 1;
}
else
break;
}
}
void HeapSort(int* a,int size)
{
//向下调整建堆 ->从最后一个非叶子节点开始
for (int i = (size - 1 - 1) / 2; i >= 0; i--)
{
AdjustDown(a, size, i);
}
//建小堆,排降序
int end = size-1;
while (end > 0)
{
Swap(&a[0], &a[end]);
AdjustDown(a, end, 0);
end--;
}
}
这里堆排序就完成了
我们测试一波
当然想要升序就建大堆就好,OK!接下来我们来计算一下堆排序的时间复杂度吧
先看建堆时间复杂度
上面的时间复杂度为O(N),但是这个算法还没有完
第二步为排序
这个好算 就是 (size-1)*向下调整法就可以了
向下调整法的时间复杂为O( N)
结点数为x 所以整个算法为 N*log2 N
所以堆排序的时间复杂度为N*log2 N
总结
这里的博客有点短了,但是没关系,内容还行,主要还是公式的计算