堆排序的基本概念
堆排序是一种利用堆这种数据结构进行排序的算法。堆是一种特殊的数据结构,它是一个完全二叉树,并且满足特定的性质:对于每个节点 i,其父节点的值始终大于或等于子节点的值(最大堆),或者父节点的值始终小于或等于子节点的值(最小堆)。堆排序的基本思想是在排序过程中通过维护堆的性质来减少比较次数,从而提高效率1。
堆排序的工作原理
堆排序的工作原理主要包括以下几个步骤:
1.构建堆:将待排序的元素构建成一个堆(通常是最大堆),即满足堆的性质。
2.堆调整:将堆顶元素(最大元素或最小元素)与堆的最后一个元素交换,然后对剩余的元素重新调整为堆,使其满足堆的性质。
3.重复步骤2:重复上述过程,每次将堆顶元素与当前堆的最后一个元素交换,并调整堆,直到所有元素都被取出,最终得到有序序列。
堆排序的C++实现
在C++中,堆排序可以
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
//h[i]表示第i个节点存放的值i从1 2*i是左节点 2*i+1是右节点
//size 表示堆中存储的元素个数,又表示最后一个节点的下标
int n,m,mySize,h[N];
void down(int u){
int t=u;//t存储三个节点中存在的最小节点的下标
if(2*u<=mySize&&h[t]>h[2*u]){
t=2*u;//左子节点存在并且小于当前节点,更新t的下标
}
if(2*u+1<=mySize&&h[t]>h[2*u+1]){
t=2*u+1;//右子节点存在并且小于当前节点,更新t的下标
}
if(u!=t){
//如果t==u以为着不动,u就是三个节点中的最小值的节点,否则就交换数值
swap(h[u],h[t]);
down(t);//交换数值后,t这个节点存储原本u的值
//u存储t的值三个数中最小的u不用调整了,t情况不明可能需要再次调整
}
}
int main(){
cin>>n>>m;
mySize=n;//初始化size表示有n个元素
for(int i=1;i<=n;i++) cin>>h[i];
for(int i=n/2;i>=1;i--){//把堆初始化
//成最小堆,从二叉树倒数第二行开始,把数字大的往下沉
down(i);
}
while(m--){
cout<<h[1]<<" ";
h[1]=h[mySize--];
down(1);
}
return 0;
}
通过以下代码实现