堆排序

来源:互联网 发布:杜克大学商学院知乎 编辑:程序博客网 时间:2024/06/05 09:39
#include<iostream>using namespace std;int a[20];void tiaozheng(int n,int m)//n为待调整的数组长度;m为从哪个结点开始; {int i=m;int j=2*i;while(j<=n){if(j+1<=n&&(a[j+1]>a[j])){j++;}if(a[i]<a[j]){int t=a[i];a[i]=a[j];a[j]=t;}i=2*i;j=2*i;    }}void creat(int n)//注意在初始化一个大根堆时开始的结点为最后一个非叶子结点,即对应数组下标为n/2; {   for(int i=n/2;i>=1;i--)   {      tiaozheng(n,i);   }} int main(){int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}creat(n);//初始化一个大根堆; //cout<<a[1]<<endl;int t=a[1];a[1]=a[n];a[n]=t;for(int i=1;i<n;i++)//不停的建立大根堆{int t=n-i;tiaozheng(t,1);//cout<<a[1]<<endl;int m;m=a[1];a[1]=a[t];a[t]=m;}for(int i=1;i<=n;i++)//大根堆实现把最大的数放在整个数组的最后,故通过大根堆建立的数组最终实现的是升序排列 {cout<<a[i]<<endl; } return 0;}

0 0
原创粉丝点击