#include <iostream> #include <ctime> using namespace std; //將兩個較小的子問題合併成一個較大的問題 void Merge(int a[],int b[],int left,int m,int right); //將大問題分解爲較小的問題:2路歸併 void MergeSort(int a[],int b[],int left,int right) { if(left < right) { int i = left+(right-left)/2; //取二路分割點 MergeSort(a,b,left,i); MergeSort(a,b,i+1,right); Merge(a,b,left,i,right); //將a中已經排好序的兩半(以i爲分割點)合併到數組b中 //將數組b複製回原數組a中 for(int i=left;i<=right;i++) a[i] = b[i]; } } void Merge(int a[],int b[],int left,int m,int right) { int i = left; int j = m+1; int k = left; while(i<=m && j<=right) { if(a[i] <= a[j]) b[k++] = a[i++]; else b[k++] = a[j++]; } while(i<=m) b[k++] = a[i++]; while(j<=right) b[k++] = a[j++]; } int main() { int N; cout<<"Input N:"; cin>>N; int *a = new int[N]; int *b = new int[N]; srand((unsigned)time(NULL)); for(int i=0;i<N;i++) { a[i] = rand(); cout<<a[i]<<" "; } cout<<endl<<endl; //歸併排序 MergeSort(a,b,0,N-1); //顯示排序後的數組 for(int i=0;i<N;i++) cout<<a[i]<<" "; cout<<endl; delete []a; delete []b; return 0; }