最近学了树的相关知识,对堆排序有了解,尝试写了些。
代码如下:
#include<iostream>
using namespace std;
int root;
void show(int a[],int n){
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
//void swap(int a,int b){
// int temp;
// temp=a;
// a=b;
// b=temp;
//}
void adjustHeap(int a[],int n){
int max;
while(root<=n/2-1){ //确保while的动作由非叶子节点的节点执行
if(root==n/2-1&&n%2==0){ //判断该根节点有几个孩子节点
max=root*2+1;
}
else{
int leftC=root*2+1;
int rightC=root*2+2;
max=a[leftC]>a[rightC]?leftC:rightC; //不能等于
}
if(a[root]<a[max]){ //不能等于
swap(a[root],a[max]); //不能重写swap函数
root=max; //变更root值,再次遍历,是为了防止本次的节点变动后,对它的下面的已经遍历过的节点产生影响
}
else return ;
}
}
void initHeap(int a[],int n){
//建立堆,是从下而上
for( root=n/2-1;root>=0;root--)
adjustHeap(a,10); //root值受上面函数影响一直变动,不可能只执行n/2-1次
}
void HeapSort(int a[]){
int p=10;
while(p>1){
//最上面为最大数,拿出来
int tem=a[p-1];
a[p-1]=a[0];
a[0]=tem;
p--; //总数减去1,是因为最后面的数,已经排好了
root=0; //这一遍自上而下
adjustHeap(a,p);
}
}
int main(){
int aq[10]={2,5,3,7,5,4,3,7,9,77};
initHeap(aq,10);//建立大根堆
show(aq,10);
HeapSort(aq);//取数,在构建大根堆
show(aq,10);
return 0;
}