DS内排—堆排序
Posted szu-ds-wys
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DS内排—堆排序相关的知识,希望对你有一定的参考价值。
题目描述
给定一组数据,使用堆排序完成数据的降序排序。(建小顶堆)。
输入
数据个数n,n个整数数据
输出
初始创建的小顶堆序列
每趟交换、筛选后的数据序列,输出格式见样例
样例输入
8 34 23 677 2 1 453 3 7
样例输出
8 1 2 3 7 23 453 677 34 8 2 7 3 34 23 453 677 1 8 3 7 453 34 23 677 2 1 8 7 23 453 34 677 3 2 1 8 23 34 453 677 7 3 2 1 8 34 677 453 23 7 3 2 1 8 453 677 34 23 7 3 2 1 8 677 453 34 23 7 3 2 1
提示
#include<iostream> using namespace std; void printnum(int *num,int n) { cout<<n<<" "; for(int i=0;i<n;i++) { if(i!=n-1) cout<<num[i]<<" "; else cout<<num[i]<<endl; } } void adjust(int *num,int i,int n)///除了刚换的顶其他都满足堆性质 { int s;///小顶堆,降序排列 while(2*i+1<n) { s=2*i+1; if(s+1<n&&num[s]>num[s+1])///有右孩子并且右孩子比左孩子小 s++; if(num[i]>num[s]) { swap(num[i],num[s]); i=s; } else break; } } void Heapsort(int *num,int n)///数组建堆 { int i; for(i=n/2;i>=0;i--) { adjust(num,i,n); }//建堆 printnum(num,n); for(i=1;i<n;i++) { swap(num[0],num[n-i]);//堆顶出去,最底下的一个上来 //printnum(num,n); adjust(num,0,n-i);//调整 printnum(num,n); } } int main() { int n; cin>>n; int *num=new int[n]; for(int i=0;i<n;i++) cin>>num[i]; Heapsort(num,n); return 0; }
以上是关于DS内排—堆排序的主要内容,如果未能解决你的问题,请参考以下文章