D. DS内排—堆排序
题目描述
给定一组数据,使用堆排序完成数据的降序排序。(建小顶堆)。
输入
数据个数n,n个整数数据
输出
初始创建的小顶堆序列
每趟交换、筛选后的数据序列,输出格式见样例
样例查看模式
正常显示
查看格式
输入样例1 <-复制
8 34 23 677 2 1 453 3 7\n
\n
输出样例1
8 1 2 3 7 23 453 677 34\n
8 2 7 3 34 23 453 677 1\n
8 3 7 453 34 23 677 2 1\n
8 7 23 453 34 677 3 2 1\n
8 23 34 453 677 7 3 2 1\n
8 34 677 453 23 7 3 2 1\n
8 453 677 34 23 7 3 2 1\n
8 677 453 34 23 7 3 2 1
#include <iostream>
#include <vector>
using namespace std;
class node{
public:
int val;node *left,*right;
node(){
val=0;left= nullptr;right= nullptr;
}
};
node *root;
void pre(node *p){
//
int tt=20;
while (tt--){
if(p->right)pre(p->right);
if(p->left)pre(p->left);
if(p->left&&!p->right&&p->val>p->left->val){
int t=p->left->val;p->left->val=p->val;p->val=t;
} else if(p->right&&!p->left&&p->val>p->right->val){
int t=p->right->val;p->right->val=p->val;p->val=t;
} else if(p->left&&p->right&&p->val>p->left->val&&p->right->val>p->left->val){
int t=p->left->val;p->left->val=p->val;p->val=t;
} else if(p->left&&p->right&&p->val>p->right->val&&p->left->val>p->right->val){
int t=p->right->val;p->right->val=p->val;p->val=t;
}
}
}
int main(){
int n;cin>>n;
node **s=new node*[n];
for (int i = 0; i < n; ++i) {
s[i]=new node();cin>>s[i]->val;
}
int f=0;int r=1;
int tt=100;
while (tt--){
if(f<n&&r<n){
s[f]->left=s[r];r++;
if(f<n&&r<n){
s[f]->right=s[r];r++;f++;
}
}
}
vector<int >d;
int u=n;int nn=n;
while (u--){
root=s[0];
pre(root);cout<<nn<<" ";
if(u==nn-1){
for (int i = 0; i < n-1; ++i) {
cout<<s[i]->val<<" ";
}cout<<s[n-1]->val<<endl;
} else{
for (int i = 0; i < n; ++i) {
cout<<s[i]->val<<" ";
}
}
for (int i = d.size()-1; i >=0; --i) {
if(i!=0){
cout<<d[i]<<" ";
} else
cout<<d[i]<<endl;
}
int t=s[0]->val;s[0]->val=s[n-1]->val;s[n-1]->val=t;d.push_back(s[n-1]->val);s[n-1]->val=999;n--;
}
}
- 很烦的格式处理