DS内排—堆排序
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
题目描述
给定一组数据,使用堆排序完成数据的降序排序。(建小顶堆)。
输入
数据个数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 Print(int *a,int n)
{
cout<<n<<" ";
for(int i=0;i<n;i++)
if(i!=n-1)
cout<<a[i]<<" ";
else
cout<<a[i]<<endl;
}
void Adjust(int *a,int i,int n)
{
while(2*i+1<n)
{
int s = 2*i+1;
if(s+1<n&&a[s+1]<a[s])
s++;
if(a[i]>a[s])
{
swap(a[i],a[s]);
i = s;
}
else
break;
}
}
void HeapSort(int *a,int n)
{
for(int i=n/2;i>=0;i--)//建小顶堆
Adjust(a,i,n);
Print(a,n);
for(int i=1;i<n;i++)
{
swap(a[0],a[n-i]);
Adjust(a,0,n-i);
Print(a,n);
}
}
int main()
{
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
HeapSort(a,n);
return 0;
}