八大內部排序 -- 歸併排序
阿新 • • 發佈:2019-01-01
歸併排序(merge-sort):將兩個或兩個以上的有序列表組合成一個新的有序表,合併的m,n長度的兩個表的複雜度為O(m+n),n個數的序列進行歸併共有ceil(logn)次,每一次合併都是n常數級別的,所以總的複雜度為O(nlogn)。同時歸併排序是一種穩定的排序。
程式碼如下,採用的是利用遞迴的方式書寫,要對遞迴的工作方式要有比較深刻的理解哦。。
#include <iostream> using namespace std; void print(int *a,int n){ for(int i=1;i<=n;i++){ cout<<a[i]<<" "; } cout<<endl; } void Merge(int*sr,int*& tr,int i,int m,int n){ // 將有序表sr[i...m],sr[m+1...n]合併成tr[i...n] int k,j; for(j=m+1,k=i;j<=n&&i<=m;k++){ if(sr[i]<sr[j]){ tr[k]=sr[i++]; }else{ tr[k]=sr[j++]; } } while(i<=m){ tr[k++]=sr[i++]; } while(j<=n){ tr[k++]=sr[j++]; } } void Msort(int* sr,int*& tr,int s,int t){ // 將表sr[s....t]歸併成有序表tr[s....t] if(s==t) tr[s]=sr[s]; else{ int m = (s+t)/2; int *mr = new int[t+1]; Msort(sr,mr,s,m); Msort(sr,mr,m+1,t); Merge(mr,tr,s,m,t); } } void Merge_sort(int *a,int n){ Msort(a,a,1,n); } int main() { int *a; int n; cin>>n; a= new int[n+1]; for(int i=1;i<=n;i++){ cin>>a[i]; } Merge_sort(a,n); print(a,n); return 0; }