堆排序

Input

第一行一个整数N,代表要排序的整数个数。(1 < N < 200000)

第二行包含N个整数,请你使用堆排序为这N个整数按从大到小排序。

Output

输出降序排列后的结果。

Sample Input

14
99 5 36 7 22 17 46 12 2 19 25 28 1 92

Sample Output

99 92 46 36 28 25 22 19 17 12 7 5 2 1


 1 #include
 2 using namespace std;
 3 const int N=2e5+20;
 4 int n,num;
 5 int h[N];
 6 void swap(int x,int y){//交换 
 7     int t;
 8     t=h[x];
 9     h[x]=h[y];
10     h[y]=t;
11 }
12 void siftdown(int i){//向下调整 
13     int flag=0,t;//flag用来判断是否还需要调整 
14     while(i*2<=n&&flag==0){//如果有左儿子并且需要调整 
15         if(h[i]>h[i*2]){
16             t=i*2;//t来存储相对小的(因为这里建立的是最小堆) 
17         }
18         else
19             t=i;
20         if(i*2+1<=n){//如果有右儿子 
21             if(h[t]>h[i*2+1]) 
22                 t=i*2+1;
23         }
24         if(t!=i){//如果父亲不是最小的 
25             swap(t,i);//那么就交换父亲与最小的那个儿子 
26             i=t;//用i来存储最小儿子的编号 
27         }
28         else
29             flag=1;    //如果父亲是最小的,那么就不需要调整了 
30     }
31 }
32 void creat(){//创建最小堆 
33     for(int i=num/2;i>=1;i--){//从第一个非叶节点开始向下调整 
34         siftdown(i);
35     }
36 }
37 void heapsort(){//堆排序 
38     while(n>1){
39         swap(1,n);//将根节点与最后一个叶子节点交换 
40         n--;
41         siftdown(1);
42     }
43 }
44 int main(){
45     cin>>n;
46     num=n;
47     for(int i=1;i<=n;i++)
48         cin>>h[i];
49     creat();
50     heapsort();
51     for(int i=1;i<=num;i++)//输出 
52         cout<' ';    
53     return 0;
54 }

 









你可能感兴趣的:(堆排序)