合并排序
时间:2022-04-22
本文章向大家介绍合并排序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
分治算法:
用分治策略实现n个元素进行排序的方法。
基本思想:
将待排序元素分成大小大致相同的两个子集合,分别对两个子集合进行排序,最终排好序的子集合合并成所要求的排好序的集合。
源码:
/*
* mergeSort.cpp
* 合并排序算法,算法导论P.17
* Created on: 2011-12-21
* Author: LiChanghai
*/
//#include <iostream>
#include <vector>
#include <iostream>
#include <iterator>
using namespace std;
#define FLT_MAX 1.0E38 //定义一个很大的值作为哨兵
//对于待排序的数组 A[p...r], 其子数组A[p...q],A[q+1...r]已排好序
//函数 subMerge(A, p, q, r), 将两个已排好序的子数组A[p...q],A[q+1...r]
//合并成一个有序的数组代替当前的数组A[p...r]
template<typename T>
void subMerge(vector<T> &array,
typename vector<T>::iterator iterBegin,
typename vector<T>::iterator iterBarrier,
typename vector<T>::iterator iterEnd)
{
//创建两个数组,分别存放以iterBarrier为界线的array的左边部分和右边部分
vector<T> arrayLeft(iterBegin, iterBarrier+1);
vector<T> arrayRight(iterBarrier+1, iterEnd);
//在两个数组尾部分别放一个“哨兵”
T temp = T(FLT_MAX);
arrayLeft.push_back(temp);
arrayRight.push_back(temp);
//定义分别指向两个数组的迭代器
typename vector<T>::iterator iterLeft = arrayLeft.begin();
typename vector<T>::iterator iterRight = arrayRight.begin();
//定义指向原数组array的迭代器
typename vector<T>::iterator iterArray = iterBegin;
for(; iterArray != iterEnd; ++iterArray)
if(*iterLeft < *iterRight) //如果左边小,将左边的值放入原数组
{
*iterArray = *iterLeft;
++iterLeft;
}
else //如果右边小,将右边的值放入原数组
{
*iterArray = *iterRight;
++iterRight;
}
return;
}
//函数 mergeSort(A, p, r) 调用subMerge对任意数组排序,p, r为下标
//mergeSort(A, p, r)首先将数组A分为两部分
//然后递归调用其本身对这两部分 分别排序
//依次递归下去,直到只剩2个数的时候完成这两个数的排序
//然后再层层返回调用处,将已排好序的子序列合并成更大的有序序列
//最后一次调用subMerge时完成数组的排序
template<typename T>
void mergeSort(vector<T> &vec,
typename vector<T>::iterator iterHead,
typename vector<T>::iterator iterTail)
{
//测试 mergeSort 调用了多少次
//static int times_mergeSort=0;
//cout<<"the "<<++times_mergeSort<<" call mergeSort()"<<endl;
//测试 subMerge 调用了多少次
//static int times_subMerge=0;
if(iterHead < iterTail-1)
{
//数组长度的一半(错误的方法)
//typename vector<T>::size_type halfLength = (vec.size()-1)/2;
//数组长度的一半(正确方法)
typename vector<T>::difference_type halfLength=( (iterTail-iterHead)-1)/2;
//定义一个迭代器指向数组 vec 中间位置
typename vector<T>::iterator iterDivide = iterHead + halfLength;
mergeSort(vec, iterHead, iterDivide+1); //递归调用自身对前半段排序
mergeSort(vec, iterDivide+1, iterTail); //递归调用自身对后半段排序
//cout<<"the "<<++times_subMerge<<" call subMerge()"<<endl;
subMerge(vec, iterHead, iterDivide, iterTail); //将上面排好序的两段合并
}
return;
}
int main()
{
vector<int> vec;
vec.push_back(0);
vec.push_back(9);
vec.push_back(8);
vec.push_back(7);
vec.push_back(6);
vec.push_back(5);
vec.push_back(4);
vec.push_back(3);
vec.push_back(2);
vec.push_back(1);
int size = vec.size();
int *phead = &vec[0];
int *ptail = &vec[size];
mergeSort(vec,phead,ptail);
for(int i=0;i<10;i++)
cout<<vec[i]<<" ";
cout<<endl;
return 0;
}
运行结果:
- 如何查看已经安装的nginx、apache、mysql和php的编译参数
- 连仕彤博客Centos7安装Mysql数据库
- sql server 2008 操作数据表
- sql server 使用函数辅助查询
- sql server存储过程编程
- sql server 2008 数据库的完整性约束
- sql server T-SQL 基础
- sql server 触发器
- T-SQL 查询、修改数据表
- sql server 事务处理
- Android P专区免费开放 -- 同样的Android,不同的体验
- YJango:TensorFlow中层API Datasets+TFRecord的数据导入
- CentOS7上ElasticSearch安装填坑记
- ASP.NET Core 阶段性总结
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- springboot结合mysql配置
- 3分钟短文:Laravel模板,也支持一般编程语言的语法结构了
- Qt音视频开发26-ffmpeg播放器
- 手把手教你 javap 反编译分解代码,授人以鱼不如授人以渔
- LoRa终端设备ASR6505之段式LCD
- redis源码之list结构的实现
- redis源码之dict
- LoRa终端设备ASR6505之ADC采样
- LoRa终端设备ASR6505驱动DHT11
- Mysql系列第七讲 玩转select条件查询,避免采坑
- Mysql第六讲 select查询基础篇
- Mybatis系列第四讲 Mybatis使用详解(2)
- 大型项目技术栈第八讲 Redis
- 大型项目技术栈第七讲 Chosen的使用
- 大型项目技术栈第六讲 EasyExcel的使用