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 }
  • 相关阅读:
    ThreadLocal分析学习
    探究.NET的bin引用程序集运行机制看.NET程序集部署原理
    ASP.NET网页代码模型分析
    JBPM与设计模式之职责链模式
    根据webform页面大小的变化动态调整控件的大小
    jbpm binding类深入解析
    JBPM与软件架构模式之命令模式
    JBPM对象主键生成机制
    主键思维定势导致的惨案
    电脑安装windows server 2008 导致磁盘分区消失解决方法
  • 原文地址:https://www.cnblogs.com/yxsrt/p/12193604.html
Copyright © 2011-2022 走看看