常用排序算法之——归并排序

归并排序的原理:

如果数组的元素个数大于1,则:

  将数组平均分为两部分;

  左边的数组归并排序;递归

  右边的数组归并排序;递归

  将两个各自有序的数组合并,需要一个额外的辅助数组,暂时保存合并结果;返回

否则,数组元素个数为1时,已经有序;直接返回。

 

稳定排序。时间复杂度在最坏、最好、平均情况下都为O(N lgN),空间复杂度为O(N)。

 

代码:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 template<typename T>
 5 void mergeSortedArray(T src[], int first, int mid, int last, T tmp[])
 6 {
 7     int i = first, j = mid + 1;
 8     int idx = 0;
 9 
10     while(i <= mid && j <= last)
11     {
12         tmp[idx++] = src[i] < src[j] ? src[i++] : src[j++];
13     }
14 
15     while(i <= mid)
16     {
17         tmp[idx++] = src[i++];
18     }
19     while(j <= last)
20     {
21         tmp[idx++] = src[j++];
22     }
23 
24     for(i = 0; i < idx; ++i)
25     {
26         src[first + i] = tmp[i];
27     }
28 }
29 
30 template<typename T>
31 void mergeSort(T src[], int first, int last, T tmp[])
32 {
33     if(first >= last)
34         return;
35 
36     int mid = first + ((last - first) >> 1);  //找到中间元素下标,将数组分为两部分
37 
38     mergeSort(src, first,   mid,  tmp);       //排序左边子数组
39     mergeSort(src, mid + 1, last, tmp);
40 
41     mergeSortedArray(src, first, mid, last, tmp);  //合并,tmp为辅助数组,用于记录临时合并的结果
42 }
43 
44 int main()
45 {
46     const int n = 5;
47 
48     int    ia[n] = {1, 3, 6, 2, 4};
49     int    itmp[n];
50     mergeSort(ia, 0, n - 1, itmp);  //sort
51     for(int i = 0; i < n; ++i)
52         cout << ia[i] << ' ';
53     cout << endl;
54 
55     double da[n] = {1.2, 3.4, 6.7, 2.3, 4.5};
56     double dtmp[n];
57     mergeSort(da, 0, n - 1, dtmp);  //sort
58     for(int i = 0; i < n; ++i)
59         cout << da[i] << ' ';
60     cout << endl;
61 return 0;
62
}

 

posted @ 2014-08-11 22:29  阿杰的专栏  阅读(243)  评论(0编辑  收藏  举报