PAT (Advanced Level) Practice 1098 Insertion or Heap Sort (25 分)
阿新 • • 發佈:2018-11-30
好像還是第一次寫堆排序,還是寫點東西總結一下比較好
排序的思路就是每次把堆頂和堆尾的元素互換,那麼此時可能會造成堆不滿足大頂堆,就需要從頭開始調整,調整肯定是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;
}