常用排序算法之——归并排序
归并排序的原理:
如果数组的元素个数大于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 }