1. 程式人生 > >PAT (Advanced Level) Practice 1098 Insertion or Heap Sort (25 分)

PAT (Advanced Level) Practice 1098 Insertion or Heap Sort (25 分)

好像還是第一次寫堆排序,還是寫點東西總結一下比較好
排序的思路就是每次把堆頂和堆尾的元素互換,那麼此時可能會造成堆不滿足大頂堆,就需要從頭開始調整,調整肯定是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; }