排序之归并排序
1 /* 2 排序 之 归并排序 3 T(n) = O(nlogn) 4 通过分治思想,将数组不断二分 5 最后通过合并两组数据(合并数据时间复杂度为O(n))递归实现排序 6 不论什么情况,时间复杂度都为O(nlogn) 7 但是注意付出了开辟空间(t[maxn])的代价 8 */ 9 #include <iostream> 10 using namespace std; 11 const int maxn = 5; 12 int a[maxn] = {5, 4, 3, 2, 1},t[maxn]; 13 void merge(int a[], int l, int m, int r)//合并a[l,m]和a[m+1,r]这两组数据 14 { 15 int i = l, j = m + 1, x = m, y = r, k = 0; 16 while(i <= x && j <= y)//当a[l,m]或者a[m+1,r]任意一组填完退出 17 if(a[i] < a[j]) t[k++] = a[i++]; 18 else t[k++] = a[j++]; 19 while(i <= x) t[k++] = a[i++];//剩下的都是比前面大的,直接填 20 while(j <= y) t[k++] = a[j++]; 21 for(int i = 0; i < k; ++i)//将排好序的数覆盖原来位置 22 a[l+i] = t[i]; 23 } 24 void merge_sort(int a[],int l,int r) 25 { 26 if(l >= r) return; 27 int m = (l+r)/2; 28 merge_sort(a,l,m);//排序左半边 29 merge_sort(a,m+1,r);//排序右半边 30 merge(a,l,m,r);//合并两组数据 31 } 32 void print() 33 { 34 for(int i = 0; i < maxn; ++i) 35 cout << a[i] << " "; 36 cout << endl; 37 } 38 int main() 39 { 40 print(); 41 merge_sort(a,0,maxn-1); 42 print(); 43 return 0; 44 }