基本原理:利用递归与分治技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归步骤

将排好序的半子表合并成为越来越大的有序序列。

对于给定的一组记录,首先将两个相邻的长度为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 }