• 八种排序整理(八)----归并排序


    基本原理:利用递归与分治技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归步骤

    将排好序的半子表合并成为越来越大的有序序列。

    对于给定的一组记录,首先将两个相邻的长度为1的子序列进行归并,得到n/2个长度为2或者1的有序子序列,

    在将其两两归并,反复执行此过程,直到得到一个有序的序列为止。

    归并排序特点:

    平均时间复杂度 :    O(nlog2n)

    稳        定       性:    稳定

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 void Merge(int array[], int start, int middle, int end)
     6 {
     7     int i, j, k, n1, n2;
     8     
     9     n1 = middle - start + 1;              
    10     n2 = end - middle; 
    11 
    12     int *L = (int *)malloc(n1 * sizeof(int));
    13     int *R = (int *)malloc(n2 * sizeof(int));
    14 
    15     for (i = 0, k = start; i < n1; i++, k++)
    16     {
    17         L[i] = array[k];
    18     }
    19 
    20     for (i = 0, k = middle + 1; i < n2; i++, k++)
    21     {
    22         R[i] = array[k];
    23     }
    24 
    25     for (k = start, i = 0, j = 0; i < n1 && j < n2; k++)
    26     {
    27         if (L[i] < R[j])
    28         {
    29             array[k] = L[i];
    30             i++;
    31         }
    32         else
    33         {
    34             array[k] = R[j];
    35             j++;
    36         }
    37     }
    38 
    39     if (i < n1)
    40     {
    41         for (j = i; j < n1; j++, k++)
    42         {
    43             array[k] = L[j];
    44         }
    45     }
    46 
    47     if (j < n2)
    48     {
    49         for (i = j; i < n2; i++, k++)
    50         {
    51             array[k] = R[i];
    52         }
    53     }
    54 }
    55 
    56 void MergeSort(int array[], int start, int end)
    57 {
    58     int middle;
    59     int i;
    60 
    61     if (start < end)
    62     {
    63         middle = (start + end) / 2;
    64         
    65         MergeSort(array, start, middle);
    66         MergeSort(array, middle + 1, end);
    67         Merge(array, start, middle, end);
    68     }
    69 }
    70 
    71 int main()
    72 {
    73     int i = 0;
    74     int a[] = {49, 38, 65, 97, 76, 13, 27};
    75     int length = sizeof(a) / sizeof(a[0]);
    76 
    77     MergeSort(a, 0, length -1);
    78 
    79     for (i = 0 ; i < length; i++)
    80     {
    81         printf("%d ", a[i]);
    82     }
    83     printf("
    ");
    84     while(1);
    85 
    86     return 0;
    87 }

  • 相关阅读:
    Corlpack 0.5.1 发布,Ada 工具包
    HTML5状况及发展形势报告发布
    c++gtkutils 2.0.14 发布,轻量级的 C++ 类库
    Resin 4.0.34 发布,Java应用服务器
    IntelliJ IDEA 12.0.3 更新版发布
    StoryText 3.9 发布,图形界面测试工具
    UberStudent 2.0 "Lightweight" 发布
    中国移动集中化BI探索:数据仓库与Hadoop混搭
    MariaDB 10.0 和 MySQL 5.6 有何不同
    Java 转原生平台代码 RoboVM
  • 原文地址:https://www.cnblogs.com/kutoli/p/8343582.html
Copyright © 2020-2023  润新知