归并排序【代码】

思路参考:

《算法导论》第三版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 }

 

posted @ 2017-10-28 19:31  nullxjx  阅读(834)  评论(0编辑  收藏  举报