
前面博客已经分享过堆的知识了,今天我们来分享堆排序。
堆排序
   堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。
★★★需要注意的是排升序要建大堆,排降序建小堆。
流程图

直接选择排序的特性总结:
  1. 堆排序使用堆来选数,效率就高了很多。
   2. 时间复杂度:O(N*logN)
   3. 空间复杂度:O(1)
   4. 稳定性:不稳定
代码实现:
在此我们利用向下调整方法建堆,以及后续调整堆顶数据
  
 
void AdjustDown(int* a, int n, int parent)
{
	int child = parent * 2 + 1;
	while (child < n)
	{
		// 假设法,选出左右孩子中小的那个孩子
		if (child + 1 < n && a[child + 1] < a[child])
		{
			++child;
		}
		if (a[child] < a[parent])
		{
			Swap(&a[child], &a[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}
// 升序,建大堆还是小堆呢?大堆
// O(N*logN)
void HeapSort(int* a, int n)
{
	// a数组直接建堆 O(N)
	for (int i = (n - 1 - 1) / 2; i >= 0; --i)
	{
		AdjustDown(a, n, i);
	}
	// O(N*logN)
	int end = n - 1;
	while (end > 0)
	{
		Swap(&a[0], &a[end]);
		AdjustDown(a, end, 0);
		--end;
	}
}
这个博客如果对你有帮助,给博主一个免费的点赞就是最大的帮助❤
如果有疑问或有不同见解,欢迎在评论区留言哦❤
后续我会一直分享双一流211西北大学软件(C,数据结构,C++,Linux,MySQL)的学习干货以及重要代码的分享



















