zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    eclips搭建python开发环境
    win7下odoo服务启动又停止解决方法
    ubuntu14.04调节屏幕亮度
    在ubunut下使用pycharm和eclipse进行python远程调试
    读书笔记——乔布斯,做最好的自己,共创式教练
    压力测试工具——Galting
    番茄工作法和Bullet Journal笔记法
    Openstack Swift中间件编写
    《黑客》读书笔记
    用腻了bootstrap的可以试试semantic-ui
  • 原文地址:https://www.cnblogs.com/yxsrt/p/12193604.html
Copyright © 2011-2022 走看看