思路参考:
《算法导论》第三版P17
代码如下:
1 // 171028归并排序.cpp: 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 #include <random> 7 #include <memory> 8 9 using namespace std; 10 11 /* 12 * 将一个数组中的两个相邻有序区间合并成一个 13 * 14 * 参数说明: 15 * a -- 包含两个有序区间的数组 16 * start -- 第1个有序区间的起始地址。 17 * mid -- 第1个有序区间的结束地址。也是第2个有序区间的起始地址。 18 * end -- 第2个有序区间的结束地址。 19 */ 20 void merge(unsigned int a[], int start, int mid, int end)//按照升序排列 21 { 22 unsigned int *tmp = new unsigned int[(end - start + 1) * sizeof(unsigned int)] {0}; // tmp是汇总2个有序区的临时区域 23 int i = start; // 第1个有序区的索引 24 int j = mid + 1; // 第2个有序区的索引 25 int k = 0; // 临时区域的索引 26 27 while (i <= mid && j <= end) 28 { 29 if (a[i] <= a[j])//如果按照降序排列则改成a[i] >= a[j] 30 tmp[k++] = a[i++]; 31 else 32 tmp[k++] = a[j++]; 33 } 34 35 while (i <= mid) 36 tmp[k++] = a[i++]; 37 38 while (j <= end) 39 tmp[k++] = a[j++]; 40 41 // 将排序后的元素,全部都整合到数组a中。 42 for (i = 0; i < k; i++) 43 a[start + i] = tmp[i]; 44 delete tmp; 45 } 46 47 /* 48 * 归并排序(从上往下) 49 * 50 * 参数说明: 51 * a -- 待排序的数组 52 * start -- 数组的起始地址 53 * endi -- 数组的结束地址 54 */ 55 void merge_sort_up2down(unsigned int a[], int start, int end) 56 { 57 if (a == NULL || start >= end) 58 return; 59 60 int mid = (end + start) / 2; 61 merge_sort_up2down(a, start, mid); // 递归排序a[start...mid] 62 merge_sort_up2down(a, mid + 1, end); // 递归排序a[mid+1...end] 63 merge(a, start, mid, end); // a[start...mid] 和 a[mid...end]是两个有序空间, 64 // 将它们排序成一个有序空间a[start...end] 65 } 66 67 int main() 68 { 69 default_random_engine e; 70 uniform_int_distribution<unsigned> u(0, 100); 71 unsigned int test[9] = { 1,4,6,9,7,2,8,5,3 }; 72 /*for (int i = 0; i < 20; i++) 73 { 74 test[i] = u(e); 75 }*/ 76 cout << "排序之前的数组序列: "; 77 for (auto c : test) 78 cout << c << ends; 79 cout << endl; 80 81 merge_sort_up2down(test, 0, sizeof(test)/sizeof(test[0])-1);// 归并排序(从上往下) 82 cout << "排序之前的数组序列: "; 83 for (auto c : test) 84 cout << c << ends; 85 cout << endl; 86 return 0; 87 }