• MergeSort(归并排序)原理及C++代码实现


    归并排序利用分治策略进行排序。原理如下

    分解:分解待排的n个元素的序列成个具n/2个元素的两个子序列。

    解决:使用归并排序递归地排序两个子序列。

    合并:合并两个已排序的子序列以产生已排序的答案。

    归并排序的时间复杂度是θ(nlgn)。

    归并排序是稳定排序之一。

    归并排序不是原址排序,在合并阶段需要申请额外的数组空间。

    代码如下:(仅供参考)

    1 void MergeSort(int * const begin, int * const end) {
    2     if (begin + 1 >= end)
    3         return ;
    4     int m = (end - begin) / 2;
    5     MergeSort(begin, begin + m);
    6     MergeSort(begin + m, end);
    7     Merge(begin, begin + m, end);
    8 }
     1 //不使用哨兵的版本,需判断边界条件
     2 void Merge(int * const first, int * const mid, int * const last) {
     3     vector<int> left(first, mid);
     4     vector<int> right(mid, last);
     5 
     6     int i = 0, j = 0, k = 0;
     7     while (i != left.size() && j != right.size()) {
     8         if (left[i] <= right[j]) {
     9             *(first + k) = left[i++];
    10         } else {
    11             *(first + k) = right[j++];
    12         }
    13         ++k;
    14     }
    15     while (i != left.size()) {
    16         *(first + k) = left[i++];
    17         ++k;
    18     }
    19     while (j != right.size()) {
    20         *(first + k) = right[j++];
    21         ++k;
    22     }
    23 }
     1 //使用哨兵来简化代码
     2 void Merge(int * const first, int * const mid, int * const last) {
     3     vector<int> left(first, mid);
     4     vector<int> right(mid, last);
     5     left.push_back(INT_MAX);       //哨兵INT_MAX必须总是比较中的较大者
     6     right.push_back(INT_MAX);      //即待排序的值必须比INT_MAX小
     7 
     8     int i = 0, j = 0;
     9     for (int k = 0; k < last - first; ++k) {
    10         if (left[i] <= right[j]) {
    11             *(first + k) = left[i++];
    12         } else {
    13             *(first + k) = right[j++];
    14         }
    15     }
    16 }
  • 相关阅读:
    《Qt学习系列笔记》--章节索引
    Qt-绘制图表
    Qt-可视化数据库操作
    Qt-数据库操作SQLite
    古人说的最好,临渊羡鱼,不如退而结网, 这是个勇气问题.
    阿里云产品之数据中台架构
    使用HSDB查看类变量的内存布局(5)
    文件流
    类文件介绍
    类的连接之重写(1)
  • 原文地址:https://www.cnblogs.com/yxsrt/p/12193604.html
Copyright © 2020-2023  润新知