MergeSort(归并排序)原理及C++代码实现
2024-08-31 05:38:38
归并排序利用分治策略进行排序。原理如下
分解:分解待排的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++];
}
}
}
最新文章
- java web 学习 --第十天(Java三级考试)
- zigbee学习之路(五):定时器1(查询方式)
- CentOS 7 中设置启动模式
- C语言 三级指针的应用
- sql 联合查询并更新
- extjs中的下载并对文件重命名功能的实现
- ExtJS4.2学习(五)表格渲染与复选框
- ArcGIS Runtime for Android开发教程V2.0(1)基本概念
- Android基础知识、四大组件(转)
- Django合集
- java_基础_异常
- 关于win10环境下Anaconda python,用pip安装包及升级时SSL报错的问题
- 终于不再在懵逼mysql原生语句,orm超级登场
- python中time模块常用功能
- JavaScript 获取 flash 对象
- MinGW安装教程——著名C/C++编译器GCC的Windows版本
- EasyNVR H5无插件RTSP直播方案在Windows server 2012上修复无法定位GetNumaNodeProcessorMaskEx的问题
- [Objective-C语言教程]指针(15)
- Mybatis-动态 SQL语句
- 记Weblogic采用RAC方式链接数据库遇到的问题