C++堆排序算法的实现方法
堆排序是一种高效的排序算法,使用一定程度的空间复杂度换来更快的时间复杂度。下面将详细讲解C++中堆排序算法的实现方法。
算法实现步骤:
- 将待排序数组构建成一个二叉堆。
- 将堆顶元素与堆底元素进行交换。
- 对除了堆底元素以外的堆进行调整,使其重新成为一个新的堆。
- 重复2、3步骤,直到整个数组排序完成。
代码实现
C++中STL容器提供了优先队列(priority_queue)来实现堆(heap)。利用priority_queue就可以非常简便的实现堆排序。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int main()
{
priority_queue<int,vector<int>,greater<int> >heap;//建小根堆
int ans=0; //ans即为最终结果
int n;cin>>n;
for(int i=1;i<=n;i++)
{
int x; scanf("%d",&x);
heap.push(x);//将元素推入堆中
}
while(heap.top()>=n)//top()取栈顶元素
{
int tmp=heap.top();//获取堆顶元素
heap.pop();//将堆顶元素弹出
if(tmp>=n)ans++,//该元素大于等于n时结果+1
if(tmp%2==0)heap.push(tmp/2);
else heap.push(tmp/2+1),heap.push(tmp/2);//该元素为奇数时分成两个元素入队
}
cout<<ans<<"\n";
return 0;
}
上述代码中,通过priority_queue构建小根堆,将元素推入堆中并通过堆顶元素获取最小值。
示例演示
例如,如下对一个数组进行堆排序:
4 3 1 5 6 2
对于这个数组,通过priority_queue构建小根堆,优先队列变为:
1
2
3
4
5
6
将堆顶元素1与堆底元素6进行交换,得到:
6
2
3
4
5
1
对除了6以外的堆进行调整,使其成为新的堆,如下:
2
4
3
6
5
1
此时再将堆顶元素2与堆底元素5进行交换,得到:
5
4
3
6
2
1
再次对除了5以外的堆进行调整,得到新的堆:
3
4
1
6
2
此时再将堆顶元素3与堆底元素2进行交换,得到:
2
4
1
6
3
再次对除了2以外的堆进行调整,得到新的堆:
1
4
3
6
最后将堆顶元素1与堆底元素6进行交换,排序完成。
以上是C++中堆排序算法的实现方法及示例说明。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++堆排序算法的实现方法 - Python技术站