#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; }