zoukankan      html  css  js  c++  java
  • 王道数据结构 (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 ", 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 ", 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
    ",
    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
    ",
    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

    越努力越幸运
  • 相关阅读:
    第一个shell脚本(bash脚本)
    通过Nginx反向代理配置/.well-known/pki-validation/fileauth.txt步骤实例
    Windows注册表中修改UAC(用户账号控制)及批处理脚本
    ssh免密码认证
    ansible快速文档
    devops基础06--maven pom.xml
    java开发基础
    devops基础05--nexus
    devops基础04--maven
    centos7下安装postgresql13
  • 原文地址:https://www.cnblogs.com/guangzhou11/p/13535705.html
Copyright © 2011-2022 走看看