归并排序

归并排序也是一种常用的排序算法, 其时间复杂度为O(n*logn), 它的基础是分治的思想。
其基本思路就是把数组分成两组A,B, 如果这两组内的数据都是有序的, 那么就可以很方便的对这两组数据进行合并排序。
但是如何让这两组数据有序呢? 
归并法的思想就是把A,B两组各自再分成两组, 依次类推, 当分出来的小组数据只有一个的时候, 即可以认为小组数据已经达到了有序。 然和合并相邻的两个小组就OK了
~ 代码: #include<stdio.h> #include <iostream> using namespace std; #define SIZE 10 //合并数组的前半部分和后半部分, 前提就是前后两个子数组分别都已经排好序了 void mergeArray(int a[], int first, int mid, int last) {          int i, j, m, n;     i = first, m = mid;     j = mid+1, n = last;     int k = 0;     int temp[SIZE];          while(i<=m && j<=n) {         if(a[i] < a[j]) {             temp[k++] = a[i++];         } else {             temp[k++] = a[j++];         }     }          while(i<=m) temp[k++] = a[i++];     while(j<=n) temp[k++] = a[j++];          for(i=0; i<k; i++) {         a[first+i] = temp[i];     }      } //归并排序 void merge_sort(int a[], int start, int end) {     int mid = (start+end)/2;     if(start<end) {         merge_sort(a, start, mid);         merge_sort(a, mid+1, end);         mergeArray(a, start, mid, end);     } } int main() {     int a[SIZE];     int i;     int T;cin>>T;     while(T--){         int n;         cin>>n;     for(i=0; i<n; i++)     {         scanf("%d",&a[i]);     }     merge_sort(a, 0, n-1);     for(i=0; i<n; i++)     {         printf("%d ", a[i]);     }     printf(" ");     }     return 0; }
原文地址:https://www.cnblogs.com/xiao-xue-di/p/9454834.html