归并排序

归并排序和快速排序一样,也是一种通过分治思想来提升排序速度的高效排序算法。归并排序采用这样一种策略,将待排序的序列分为两部分,这两个部分分别进行排序。排序完成时,这两部分都是有序的,然后再依次比较这两个序列中元素的大小,将这些元素插入到新的序列当中,这个新的序列就是最终排序结果。

两个有序序列合并为一个序列的过程

归并排序代码如下:

 1 int*Merge(int a1[],int a2[],int n,int m) // 归并排序的合并函数
 2 {
 3     int num = n + m;
 4     int*b = new int[num];
 5     int index1,index2,index3;
 6     for(index1=index2=index3=0;index1<n&&index2<m;index3++)
 7     {
 8         if(a1[index1]<a2[index2])b[index3] = a1[index1++];
 9         else b[index3] = a2[index2++];
10     }
11     while(index1<n) b[index3++] = a1[index1++];
12     while(index2<m) b[index3++] = a2[index2++];
13     return b;
14 }
15 int*MergeSort(int a[],int left,int right)
16 {
17     if(left==right)
18     {
19         int*b = new int;
20         *b = a[left];
21         return b;
22     }
23     int m = (right-left+1);
24     int n = (right-left+1)/2;
25     int*a1 = MergeSort(a,left,left+n-1);
26     int*a2 = MergeSort(a,left+n,right);
27     int*b = Merge(a1,a2,n,m-n);
28     return b;
29 }

归并排序的优点

归并排序的时间复杂度很稳定,最好,最坏,平均时间复杂度都为O(nlogn)。