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

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

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

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

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

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

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

代码如下:(仅供参考)

 void MergeSort(int * const begin, int * const end) {
if (begin + >= end)
return ;
int m = (end - begin) / ;
MergeSort(begin, begin + m);
MergeSort(begin + m, end);
Merge(begin, begin + m, end);
}
 //不使用哨兵的版本,需判断边界条件
void Merge(int * const first, int * const mid, int * const last) {
vector<int> left(first, mid);
vector<int> right(mid, last); int i = , j = , k = ;
while (i != left.size() && j != right.size()) {
if (left[i] <= right[j]) {
*(first + k) = left[i++];
} else {
*(first + k) = right[j++];
}
++k;
}
while (i != left.size()) {
*(first + k) = left[i++];
++k;
}
while (j != right.size()) {
*(first + k) = right[j++];
++k;
}
}
 //使用哨兵来简化代码
void Merge(int * const first, int * const mid, int * const last) {
vector<int> left(first, mid);
vector<int> right(mid, last);
left.push_back(INT_MAX); //哨兵INT_MAX必须总是比较中的较大者
right.push_back(INT_MAX); //即待排序的值必须比INT_MAX小 int i = , j = ;
for (int k = ; k < last - first; ++k) {
if (left[i] <= right[j]) {
*(first + k) = left[i++];
} else {
*(first + k) = right[j++];
}
}
}

最新文章

  1. java web 学习 --第十天(Java三级考试)
  2. zigbee学习之路(五):定时器1(查询方式)
  3. CentOS 7 中设置启动模式
  4. C语言 三级指针的应用
  5. sql 联合查询并更新
  6. extjs中的下载并对文件重命名功能的实现
  7. ExtJS4.2学习(五)表格渲染与复选框
  8. ArcGIS Runtime for Android开发教程V2.0(1)基本概念
  9. Android基础知识、四大组件(转)
  10. Django合集
  11. java_基础_异常
  12. 关于win10环境下Anaconda python,用pip安装包及升级时SSL报错的问题
  13. 终于不再在懵逼mysql原生语句,orm超级登场
  14. python中time模块常用功能
  15. JavaScript 获取 flash 对象
  16. MinGW安装教程——著名C/C++编译器GCC的Windows版本
  17. EasyNVR H5无插件RTSP直播方案在Windows server 2012上修复无法定位GetNumaNodeProcessorMaskEx的问题
  18. [Objective-C语言教程]指针(15)
  19. Mybatis-动态 SQL语句
  20. 记Weblogic采用RAC方式链接数据库遇到的问题

热门文章

  1. js数组全等
  2. elastic启动脚本
  3. SQL基础教程(第2版)第7章 集合运算:7-2 联结(以列为单位对表进行联结)
  4. idea使用eclipse风格
  5. Hadoop的常用指令
  6. CMake变量(提供信息的变量)
  7. MyBatis学习——动态SQL
  8. BitcoinCore JSONRPC Java使用,创建账号,获取余额,转账等等...
  9. DAO层使用mybatis框架有关实体类的有趣细节
  10. springBoot 使用redis 和 StringRedisTemplate 常用操作