啊哈哈,没想到吧,小吉最近更的这么频繁,这篇是继上一篇c++实现堆的连续,趁热打铁把堆排序算法给大家讲讲
当然,如果有些小伙伴不够了解堆的话,可以先看看我上一篇blog,再来看这篇,传送门🚪:c++实现堆
接下来就进入我们的正题,在实现堆排序算法之前,我先讲讲堆排序的算法思路
算法思路
- heapify建立大顶堆
- 将堆顶与堆底元素交换(即最大元素被交换到堆底),缩小并下潜调整堆
- 重复第二步直至堆里剩下一个元素
堆排序的代码实现
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到这里就已经全部结束了,如果小伙伴对上面👆的三道题有疑问,可以私信小吉❤️,到时候看大家反馈,再决定要不要出一篇讲解这三道题的博客。
最后创作不易,还望各位小可爱们多多支持(点赞收藏关注),你们的支持是我更新下去的动力😘😘😘