基本原理:利用递归与分治技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归步骤
将排好序的半子表合并成为越来越大的有序序列。
对于给定的一组记录,首先将两个相邻的长度为1的子序列进行归并,得到n/2个长度为2或者1的有序子序列,
在将其两两归并,反复执行此过程,直到得到一个有序的序列为止。
归并排序特点:
平均时间复杂度 : O(nlog2n)
稳 定 性: 稳定
1 #include <iostream> 2 3 using namespace std; 4 5 void Merge(int array[], int start, int middle, int end) 6 { 7 int i, j, k, n1, n2; 8 9 n1 = middle - start + 1; 10 n2 = end - middle; 11 12 int *L = (int *)malloc(n1 * sizeof(int)); 13 int *R = (int *)malloc(n2 * sizeof(int)); 14 15 for (i = 0, k = start; i < n1; i++, k++) 16 { 17 L[i] = array[k]; 18 } 19 20 for (i = 0, k = middle + 1; i < n2; i++, k++) 21 { 22 R[i] = array[k]; 23 } 24 25 for (k = start, i = 0, j = 0; i < n1 && j < n2; k++) 26 { 27 if (L[i] < R[j]) 28 { 29 array[k] = L[i]; 30 i++; 31 } 32 else 33 { 34 array[k] = R[j]; 35 j++; 36 } 37 } 38 39 if (i < n1) 40 { 41 for (j = i; j < n1; j++, k++) 42 { 43 array[k] = L[j]; 44 } 45 } 46 47 if (j < n2) 48 { 49 for (i = j; i < n2; i++, k++) 50 { 51 array[k] = R[i]; 52 } 53 } 54 } 55 56 void MergeSort(int array[], int start, int end) 57 { 58 int middle; 59 int i; 60 61 if (start < end) 62 { 63 middle = (start + end) / 2; 64 65 MergeSort(array, start, middle); 66 MergeSort(array, middle + 1, end); 67 Merge(array, start, middle, end); 68 } 69 } 70 71 int main() 72 { 73 int i = 0; 74 int a[] = {49, 38, 65, 97, 76, 13, 27}; 75 int length = sizeof(a) / sizeof(a[0]); 76 77 MergeSort(a, 0, length -1); 78 79 for (i = 0 ; i < length; i++) 80 { 81 printf("%d ", a[i]); 82 } 83 printf("\n"); 84 while(1); 85 86 return 0; 87 }