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 }