堆排序:堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。(来自某度百科)。
堆排序的优点:
-
堆排序的效率与快排、归并相同,都达到了基于比较的排序算法效率的峰值(时间复杂度为O(nlogn))
-
除了高效之外,最大的亮点就是只需要O(1)的辅助空间了,既最高效率又最节省空间,只此一家了
-
堆排序效率相对稳定,不像快排在最坏情况下时间复杂度会变成O(n^2)),所以无论待排序序列是否有序,堆排序的效率都是O(nlogn)不变(注意这里的稳定特指平均时间复杂度=最坏时间复杂度,不是那个“稳定”,因为堆排序本身是不稳定的)
实现一个堆排序,给出每次调整成堆后序列的变化情况
要求
输入
待排序序列
输出
每次调成成堆后的序列
用数组存储所有元素,构造最大堆。
把数组首元素(数组中值最大)与数组最后一个元素交换位置,对除去排好序的元素构造最大堆。
递归上述操作,直至数组中只有一个元素未排序结束。
#include "iostream"
using namespace std;
int a[100];
int count=0;
int main()
{
void sort(int n,int m);//生成最大堆
void solve(int n);//选出队首元素
int i=0,ch,n=0,max;
int sum=0;
while((ch=cin.get())!=EOF)
{
if(ch=='\n')
{
a[i]=sum;
sum=0;
i++;
break;
}
if(ch==' ')
{
a[i]=sum;
sum=0;
i++;
continue;
}
sum=sum*10+(ch-48);
}
n=i;
count=n;
solve(n);
//cout<<"排序后:"<<endl;
for(i=0;i<n;i++)
cout<<a[i]<<endl;
return 0;
}
void solve(int n)
{
void sort(int n,int m);
if(n==1)
return;
int max;
for(int i=n/2-1;i>=0;i--)
{
sort(i,n/2-1);
}
max=a[0];
a[0]=a[n-1];
a[n-1]=max;
count--;
/*cout<<"排序后:"<<endl;
for(int i=0;i<5;i++)
cout<<a[i]<<endl;*/
solve(n-1);
}
void sort(int n,int m)
{
if(n==m+1)
return;
int max=0;
if(2*n+3<=count) //判断是否存在度为1 的结点
{
if(a[2*n+1]>a[2*n+2])//根节点 与左右子树比较 选出最大的做根节点
{
max=a[2*n+1];
if(a[n]<max)
{
a[2*n+1]=a[n];
a[n]=max;
}
}
else
{
max=a[2*n+2];
if(a[n]<max)
{
a[2*n+2]=a[n];
a[n]=max;
}
}
}
else
{
if(a[n]<a[2*n+1])
{
max=a[n];
a[n]=a[2*n+1];
a[2*n+1]=max;
}
}
sort(n+1,m);
}