PTA 7-1 堆排序 (20 分)

这道作业题挺值得研究的
 
7-1 堆排序 (20 分)
 
作者
严华云
单位
湖州师范学院
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
 

对n个数,要求用堆排序(最大堆)对其进行排序。

输入格式:

第一行一个n(n<1000)。第二行给出n个数。

输出格式:

输出n行,每行n个数。第一行表示将n个数(将n个数看成一棵树)变成最大堆后的结果,第二行表示将上次结果的根节点交换到现有节点的最后一个节点(然后将除最后一个节点的数看成一颗树),然后将该剩余节点树从新变成最大堆后的结果输出(包括交换到最后的节点),依次类推。

输入样例:

6
7 1 6 4 3 5
 

输出样例:

7 4 6 1 3 5 
6 4 5 1 3 7 
5 4 3 1 6 7 
4 1 3 5 6 7 
3 1 4 5 6 7 
1 3 4 5 6 7 
 

AC代码

 1 //
 2 //  main.cpp
 3 //  Cpp_Homework
 4 //
 5 //  Created by 傅鳕鱼 on 2021/6/16.
 6 //
 7 
 8 #include <iostream>
 9 #include <algorithm>
10 using namespace std;
11 
12 void HeapAdjust(int *a,int i,int size)  //调整堆
13 {
14     int lchild=2*i;       //i的左孩子节点序号
15     int rchild=2*i+1;     //i的右孩子节点序号
16     int max=i;            //临时变量
17     if(i<=size/2)          //如果i不是叶节点就不用进行调整
18     {
19         if(lchild<=size&&a[lchild]>a[max])
20         {
21             max=lchild;
22         }
23         if(rchild<=size&&a[rchild]>a[max])
24         {
25             max=rchild;
26         }
27         if(max!=i)
28         {
29             swap(a[i],a[max]);
30             HeapAdjust(a,max,size);    //避免调整之后以max为父节点的子树不是堆
31         }
32         
33         
34     }
35     
36 }
37 
38 void BuildHeap(int *a,int size)    //建立堆
39 {
40     int i;
41     for(i=size/2;i>=1;i--)    //非叶节点最大序号值为size/2
42     {
43         HeapAdjust(a,i,size);
44         
45     }
46     for(int c=1;c<=size;c++)
47         cout<<a[c]<<" ";
48     cout<<endl;
49 }
50 
51 void HeapSort(int *a,int size)    //堆排序
52 {
53     int i;
54     BuildHeap(a,size);
55     for(i=size;i>1;i--)
56     {
57         //cout<<a[1]<<" ";
58         swap(a[1],a[i]);           //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面
59           //BuildHeap(a,i-1);        //将余下元素重新建立为大顶堆
60         HeapAdjust(a,1,i-1);      //重新调整堆顶节点成为大顶堆
61         for(int c=1;c<=size;c++)
62             cout<<a[c]<<" ";
63         cout<<endl;
64         
65     }
66 }
67 
68 int main(int argc, char *argv[])
69 {
70     int a[100];
71     int size;
72     while(scanf("%d",&size)==1&&size>0)
73     {
74         int i;
75         for(i=1;i<=size;i++)
76             cin>>a[i];
77         HeapSort(a,size);
78 //        for(i=1;i<=size;i++)
79 //            cout<<a[i]<<" ";
80 //        cout<<endl;
81     }
82     return 0;
83 }

 

posted @ 2021-06-23 23:22  Fr3Nky  阅读(977)  评论(0编辑  收藏  举报