王道数据结构 (22) 归并排序

示例:

 

 

 

合并方法:

 

 

 

 

 

 

示例代码:


#include <stdio.h>
#define LEN 8 // 合并
void merge(int a[], int start, int mid, int end)
{
  int n1 = mid - start + 1;
  int n2 = end - mid;
  int left[n1], right[n2];
  int i, j, k;
  for (i = 0; i < n1; i++) /* left holds a[start..mid] */
    left[i] = a[start + i];
  for (j = 0; j < n2; j++) /* right holds a[mid+1..end] */
    right[j] = a[mid + 1 + j];
  i = j = 0;
  k = start;
  while (i < n1 && j < n2)
    if (left[i] < right[j])
      a[k++] = left[i++];
    else
      a[k++] = right[j++];
  while (i < n1) /* left[] is not exhausted */
    a[k++] = left[i++];
  while (j < n2) /* right[] is not exhausted */
    a[k++] = right[j++];
}
// merge_sort():先排序,再合并
void merge_sort(int a[], int start, int end)
{
  int mid;
  if (start < end)
  {
    mid = (start + end) / 2;
    printf("sort (%d-%d, %d-%d) %d %d %d %d %d %d %d %d\n", start, mid, mid + 1, end, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]); // 分解 + 解决:Divide + Conquer
    merge_sort(a, start, mid);                                                                                                         // 递归划分原数组左半边array[start...mid]
    merge_sort(a, mid + 1, end);                                                                                                       // 递归划分array[mid+1...end]                              // 合并:Combine
    merge(a, start, mid, end);                                                                                                         // 合并
    printf("merge (%d-%d, %d-%d) to %d %d %d %d %d %d %d %d\n", start, mid, mid + 1, end, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
  }
}
int main(void)
{
  int a[LEN] = {5, 2, 4, 7, 1, 3, 2, 6};
  merge_sort(a, 0, LEN - 1);
  return 0;
}
 

运行:

 

 

 

 

 

 

 

 

完整代码 :

 8 #include <stdio.h>
 9 #define LEN 8
10 
11 // 合并
12 void merge(int a[], int start, int mid, int end)
13 {
14     int n1 = mid - start + 1;
15     int n2 = end - mid;
16     int left[n1], right[n2];
17     int i, j, k;
18 
19     for (i = 0; i < n1; i++) /* left holds a[start..mid] */
20         left[i] = a[start+i];
21     for (j = 0; j < n2; j++) /* right holds a[mid+1..end] */
22         right[j] = a[mid+1+j];
23 
24     i = j = 0;
25     k = start;
26     while (i < n1 && j < n2)
27         if (left[i] < right[j])
28             a[k++] = left[i++];
29         else
30             a[k++] = right[j++];
31 
32     while (i < n1) /* left[] is not exhausted */
33         a[k++] = left[i++];
34     while (j < n2) /* right[] is not exhausted */
35         a[k++] = right[j++];
36 }
37 
38 // merge_sort():先排序,再合并
39 void merge_sort(int a[], int start, int end)
40 {
41     int mid;
42     if (start < end)
43     {
44         mid = (start + end) / 2;
45         printf("sort (%d-%d, %d-%d) %d %d %d %d %d %d %d %d\n",
46                start, mid, mid+1, end,
47                a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
48 
49         // 分解 + 解决:Divide + Conquer
50         merge_sort(a, start, mid); // 递归划分原数组左半边array[start...mid]
51         merge_sort(a, mid+1, end); // 递归划分array[mid+1...end]
52         // 合并:Combine
53         merge(a, start, mid, end); // 合并
54 
55         printf("merge (%d-%d, %d-%d) to %d %d %d %d %d %d %d %d\n",
56                start, mid, mid+1, end,
57                a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]);
58     }
59 }
60 
61 int main(void)
62 {
63     int a[LEN] = { 5, 2, 4, 7, 1, 3, 2, 6 };
64     merge_sort(a, 0, LEN-1);
65 
66     return 0;
67 }

代码仓库:

 

 https://gitee.com/guangzhou110/kingcraft_data_structure

posted @ 2020-08-20 16:14  1点  阅读(650)  评论(0编辑  收藏  举报