版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Nightmare_ak/article/details/84645400
好像还是第一次写堆排序,还是写点东西总结一下比较好
排序的思路就是每次把堆顶和堆尾的元素互换,那么此时可能会造成堆不满足大顶堆,就需要从头开始调整,调整肯定是2i和2i+1比,取两个中大的作为比较值,如果比儿子更大,则需要调节父子关系,一直到堆尾就调整结束了。
那么一开始构建最大堆也是同样的思路,从堆尾开始,把每个节点看成堆顶,那么就是堆顶的值发生了变化,所以调用排序调整堆顶的相同函数即可。
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100+5;
int n,a[N],b[N],c[N];
int same()
{
for(int i=1;i<=n;i++)
if(a[i]!=b[i])
return 0;
return 1;
}
void print()
{
for(int i=1;i<=n;i++)
printf("%d%c",a[i]," \n"[i==n]);
}
void insertS()
{
int ss=0;
for(int i=2;i<=n;i++)
{
int j=i;
while(j>1&&a[j]<a[j-1]) swap(a[j-1],a[j]),j--;
if(ss)
{
puts("Insertion Sort");
print();
return;
}
if(same()) ss=1;
}
}
void adjust(int l,int r)
{
while(2*l<=r)
{
int j=2*l;
if(a[j]<a[j+1]&&j+1<=r) j++;
if(a[l]<a[j]) swap(a[l],a[j]);
else break;
l=j;
}
}
void heapS()
{
for(int i=n/2;i>=1;i--)
adjust(i,n);
int ss=0;
for(int i=n;i>=2;i--)
{
swap(a[i],a[1]);
adjust(1,i-1);
if(ss)
{
puts("Heap Sort");
print();
return;
}
if(same()) ss=1;
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",a+i),c[i]=a[i];
for(int i=1;i<=n;i++)
scanf("%d",b+i);
insertS();
for(int i=1;i<=n;i++)
a[i]=c[i];
heapS();
return 0;
}