我起初认为的堆排序
刚接触堆排序的时候 将元素通过算法排成大堆或者小堆,之后将大(小)堆的元素逐个取出 ,但在继续学习的过程中发现了每次进行 堆顶元素取出时 堆的结构就被破坏 所以每次取出后都需要重新将数据排序成小(大)堆,但是这样的时间复杂度就和O(n2)的算法无异了,体现不出O(logn)排序的优势。
真正的堆排序
在后面的学习中了解到真正的堆排序 (以降序为例)
具体思路是将堆顶的元素与堆的最后一个元素进行交换(这里的堆是顺序堆),然后将堆的size–
此时堆的size为6,将 0位置的1和6位置的7交换,然后再将7进行向下调整 此时的堆为
之后依次将堆顶的元素与当前堆的最后一个元素进行交换并向下调整,此时的数据排序好之后就是我们想要的降序。
与第一次我的思路比较 堆排序的每次向下调整操作的时间复杂度为O(logn),相较于上一种有这巨大的提升。
堆排序算法代码
void AdjustDown1(int* a, int n, int parent)//文中提到的向下调整操作
{
assert(a);
int child = parent *