排序---歸並排序
阿新 • • 發佈:2018-04-05
i++ 歸並排序 blog log while space 並排 一個 ++
我覺得要能獨立寫出某一個算法,就一定要在寫代碼之前有思路。時間復雜度(o(nlog(n)))
思路: 選擇數組的中間值,對起左右進行遞歸,其中合並兩個有序的數組,最後將放到tr數組中排序好的數重新放置到原數組中。
1 #include<cstdio> 2 using namespace std; 3 int sr[5],tr[5]; 4 void rMerge(int sr[],int tr[],int s,int m,int t) //合並兩個有序的數組 5 { 6 int i=s,j=m+1,k=s; 7 while(i<=m&&j<=t){8 if(sr[i]<sr[j]) tr[k++]=sr[i++]; 9 else tr[k++]=sr[j++]; 10 } 11 while(i<=m) tr[k++]=sr[i++]; //如果有多余的數,就直接加入到裏面即可 12 while(j<=t) tr[k++]=sr[j++]; 13 } 14 15 void copy(int sr[],int tr[],int s,int t) 16 { 17 for(int i=s;i<=t;i++) 18 { 19 sr[i]=tr[i];20 } 21 } 22 23 void aSort(int sr[],int s,int t) 24 { 25 if(s<t) 26 { 27 int m=(s+t)/2; 28 aSort(sr,s,m); //對其左右分別排序 29 aSort(sr,m+1,t); 30 rMerge(sr,tr,s,m,t); //合並到tr數組 31 copy(sr,tr,s,t); //將tr數組重新返回到sr數組中 32 } 33 } 34 35 int main() 36 { 37 for(int i=0;i<5;i++) scanf("%d",&sr[i]); 38 aSort(sr,0,4); 39 for(int i=0;i<5;i++) printf("%d ",tr[i]); 40 printf("\n"); 41 }
排序---歸並排序