@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@直接插入排序@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include<cstdlib> #include <cstdio> #include <iostream> #include <algorithm> using namespace std; void Swap (int T[],int a); int main() { int n; cin>>n; int T[n]; for(int i=0;i<n;cin>>T[i],i++); for(int i=1;i<n;i++) { Swap(T, i); for(int i=0;i<n;cout<<T[i]<<" ",i++); cout<<endl; } } void Swap (int T[],int a) { int n=a-1; int i,j=T[a]; for( i=n;i>=0;i--) { if(T[i]>j) T[i+1]=T[i]; else break; } if(i!=n) T[i+1]=j; } @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@直接插入排序@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@二叉法插入排序@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include <iostream> #include <cstdio> #include <cstdlib> using namespace std; int Find(int T[],int n) { int a=1,b=n-1; //A.B搞混; T[0]=T[n]; while(a!=b) { if(T[(a+b)/2]>=T[0]&&T[(a+b)/2-1]<=T[0]) a=b=(a+b)/2; else if(T[(a+b)/2]<T[0]) a=(a+b)/2+1; else if(T[(a+b)/2]>T[0]) b=(a+b)/2-1 ; } for(int i=n;i>a;i--) T[i]=T[i-1]; T[a]=T[0]; } int main() { int n; cin>>n; int T[n+1]; for(int i=1;i<=n;i++) cin>>T[i]; for(int i=2;i<=n;i++) { if(T[i]<T[i-1]) { Find(T,i); } for(int i=1;i<=n;i++) printf("%d ",T[i]); printf("\n"); } } @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@二叉法插入排序@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@希爾排序@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include <iostream> #include <cstdio> #include <cstdlib> using namespace std; void display(int T[],int n) { for(int i=1;i<=n;i++) cout<<T[i]<<" "; cout<<endl; } int main() { int n; cin>>n; int T[n+1],increment=n; for(int i=1;i<=n;i++) cin>>T[i]; do { increment=increment/2; for(int i=increment+1;i<=n;i++) { if(T[i]<T[i-increment]) { T[0]=T[i]; int j; for( j=i-increment;j>0;j-=increment) { T[j+increment]=T[j]; if(T[0]>=T[j]) break; } T[j+increment]=T[0]; } } display(T,n); } while(increment>1) ; } @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@快速排序 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include <iostream> #include <cstdio> #include <cstdlib> using namespace std; int n; //寫個很差 沒有優化 用於display 中 說明數組大小 struct So { int size ; int *L; }; void display(int T[]) { for(int i=1;i<=n;i++) cout<<T[i]<<" "; cout<<endl; } int Partition(int T[],int low ,int high) { int j=low; T[0]=T[low]; while (low<high) { for(;T[high]>=T[0]&&high!=low;high--); T[j]=T[high]; j=high; for(;T[low]<=T[0]&&high!=low;low++); T[j]=T[low]; j=low; } T[low]=T[0]; display(T); return low; } void Sort(int T[],int low,int high) { if(low>=high) return ; //很重要 由於有可能 low>high ,由於若是Sort未排序 則pivotkey=high; int pivotkey; pivotkey=Partition(T,low,high); Sort(T,low,pivotkey-1); //若是pivotkey=low 則pivotkey-1<low Sort(T,pivotkey+1,high); } void Quick (So T) { Sort(T.L,1,T.size); } int main() { So T; cin>>T.size; n=T.size; T.L=new int [T.size+1]; for(int i=1;i<=T.size;i++) cin>>T.L[i]; Quick(T); } @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@堆排序 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> using namespace std; int n; //寫個很差 沒有優化 用於display 中 說明數組大小 struct So { int size ; int *L; }; void display(int T[]) { for(int i=1;i<=n;i++) cout<<T[i]<<" "; cout<<endl; } void heapsort(int T[],int s,int m) { int temp=T[s]; for(int j=2*s;j<=m;j=2*j) { if(j<m&&T[j]<T[j+1]) j++;//把 m寫成n 使 方程不正確,由於 m 時刻變化 而n 不變。 if(T[j]<=temp) break; T[s]=T[j]; s=j; } T[s]=temp; } int main() { So T; cin>>T.size; n=T.size; T.L=new int [T.size+1]; for(int i=1;i<=T.size;i++) cin>>T.L[i]; for(int i=n/2;i>0;i--) heapsort(T.L,i,n); for(int i=n;i>1;i--) { swap(T.L[1],T.L[i]); heapsort(T.L,1,i-1); } display(T.L); } @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@堆排序 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> using namespace std; int N; void Merge(int A[],int B[],int m,int s,int n) { int enda=s,endb=n,i=m; s++; while(m<=enda&&s<=endb) { if(B[m]<=B[s]) A[i++]=B[m++]; else A[i++]=B[s++]; } if(m<=enda) for(;i<=n;) A[i++]=B[m++]; else for(;i<=n;) A[i++]=B[s++]; } void MSort(int sr[],int th1[],int m,int n) { if(m==n) th1[m]=sr[m]; else //th1 是另外一個的 th2 ; { int th2[N]; int s=(m+n)/2 ; MSort(sr,th2,m,s); MSort(sr,th2,s+1,n); Merge(th1,th2,m,s,n); } } int main() { int n; cin>>n; N=n+1; int T[n+1],S[n+1]; for(int i=1;i<=n;i++) cin>>T[i]; MSort(T,S,1,n); for(int i=1;i<=n;i++) cout<<S[i]<<" "; cout<<endl; } @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@歸併排序 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> using namespace std; int N; void Merge(int A[],int B[],int m,int s,int n) { int enda=s,endb=n,i=m; s++; while(m<=enda&&s<=endb) { if(B[m]<=B[s]) A[i++]=B[m++]; else A[i++]=B[s++]; } if(m<=enda) for(;i<=n;) A[i++]=B[m++]; else for(;i<=n;) A[i++]=B[s++]; } void MSort(int sr[],int th1[],int m,int n) { if(m==n) th1[m]=sr[m]; else //th1 是另外一個的 th2 ; { int th2[N]; int s=(m+n)/2 ; MSort(sr,th2,m,s); MSort(sr,th2,s+1,n); Merge(th1,th2,m,s,n); } } int main() { int n; cin>>n; N=n+1; int T[n+1],S[n+1]; for(int i=1;i<=n;i++) cin>>T[i]; MSort(T,S,1,n); for(int i=1;i<=n;i++) cout<<S[i]<<" "; cout<<endl; } @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@非遞歸 歸併排序 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> using namespace std; int N; void display(int T[]) { for(int i=1;i<=N;i++) cout<<T[i]<<" "; cout<<endl; } void Merge(int A[],int B[],int m,int s,int n) { int enda=s,endb=n,i=m; s++; while(m<=enda&&s<=endb) { if(B[m]<=B[s]) A[i++]=B[m++]; else A[i++]=B[s++]; } if(m<=enda) for(;i<=n;) A[i++]=B[m++]; else for(;i<=n;) A[i++]=B[s++]; } void Mergepass(int SR[],int TR[],int s,int n) { int i=1,j=n/2/s; while(j--) { Merge(TR,SR,i,i+s-1,i+2*s-1); i=i+2*s; } if(i<n-s+1) Merge(TR,SR,i,i+s-1,n); //三種狀況 一種 是正好 2S 的倍數 第二種是餘S+k(0<k<S) 第三種 就是 2*S+K(0<K<S); else for(j=i;j<=n;j++) TR[j]=SR[j] ; display(TR); } void MSort (int T[],int length) { int k=1; int th[length+1]; while(k<length) { Mergepass(T,th,k,length); k*=2; if(k>=length) break; Mergepass(th,T,k,length); k*=2; } } int main() { int n; cin>>n; N=n; int T[n+1]; for(int i=1;i<=n;i++) cin>>T[i] ; MSort(T,n) ; }