堆排序算法


啊哈哈,没想到吧,小吉最近更的这么频繁,这篇是继上一篇c++实现堆的连续,趁热打铁把堆排序算法给大家讲讲

当然,如果有些小伙伴不够了解堆的话,可以先看看我上一篇blog,再来看这篇,传送门🚪:c++实现堆

接下来就进入我们的正题,在实现堆排序算法之前,我先讲讲堆排序的算法思路

算法思路

  1. heapify建立大顶堆
  2. 将堆顶与堆底元素交换(即最大元素被交换到堆底),缩小并下潜调整堆
  3. 重复第二步直至堆里剩下一个元素

堆排序的代码实现

void heapSort()
{
	vector<int> v1 = { 2,4,3,1,7,6,5 };
	MaxHeap maxheap(v1);
	
	while (maxheap._size > 1)
	{
		swap(maxheap._V[0], maxheap._V[maxheap._size - 1]);
		//先缩小再下潜调整堆
		maxheap._size--;
		maxheap.down(0);
	}
	
	for (vector<int>::iterator it = maxheap._V.begin(); it != maxheap._V.end(); it++)
	{
		cout << *it << ' ';
	}
	cout << endl;
}

接下来提供的是大顶堆的代码,小吉我已经在上一篇blog中详细讲解了实现大顶堆了,所以在这只提供代码(只提供堆排序所需用到的成员函数,也就是说没有增删替换等方法)🤗

class MaxHeap
{
public:
	MaxHeap(vector<int>& V)
	{
		this->_V = V;
		this->_size = V.size();
		heapify();
	}

	void heapify()//建堆
	{
		int index = (_size >> 1) - 1;
		for (int i = index; i >= 0; i--)
		{
			down(i);
		}
	}

	void down(int parent);
public:
	vector<int> _V;
	int _size;
};

void MaxHeap::down(int parent)
{
	int left = 2 * parent + 1;
	int right = left + 1;
	int max = parent;
	if (left<_size && _V[left]>_V[max])
	{
		max = left;
	}
	if (right<_size && _V[right]>_V[max])
	{
		max = right;
	}
	if (max != parent)
	{
		swap(_V[parent], _V[max]);
		down(max);
	}
}

运行结果

运行结果
好了,堆排序到这就全部讲完了,只要能自己实现堆,再去实现堆排序其实是比较简单的。

如果小伙伴们还想巩固一下堆的学习,小吉在这里推荐几道具有代表性的leetcode题。小吉试过了都可以把我们自己实现堆类粘过去并且成功解题。

🟦刷题传送门🚪:求数组第K大元素
🟦刷题传送门🚪:求数据流中第K大元素
🟦刷题传送门🚪:求数据流中位数

学习的时间总是短暂的,这篇blog到这里就已经全部结束了,如果小伙伴对上面👆的三道题有疑问,可以私信小吉❤️,到时候看大家反馈,再决定要不要出一篇讲解这三道题的博客。

最后创作不易,还望各位小可爱们多多支持(点赞收藏关注),你们的支持是我更新下去的动力😘😘😘

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值