博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
合并排序
阅读量:5924 次
发布时间:2019-06-19

本文共 2447 字,大约阅读时间需要 8 分钟。

hot3.png

分治算法:

用分治策略实现n个元素进行排序的方法。

基本思想:

将待排序元素分成大小大致相同的两个子集合,分别对两个子集合进行排序,最终排好序的子集合合并成所要求的排好序的集合。

源码:

/* * mergeSort.cpp *  合并排序算法,算法导论P.17 *  Created on: 2011-12-21 *      Author: LiChanghai *///#include 
#include
#include
#include
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
void subMerge(vector
&array, typename vector
::iterator iterBegin, typename vector
::iterator iterBarrier, typename vector
::iterator iterEnd){ //创建两个数组,分别存放以iterBarrier为界线的array的左边部分和右边部分 vector
arrayLeft(iterBegin, iterBarrier+1); vector
arrayRight(iterBarrier+1, iterEnd); //在两个数组尾部分别放一个“哨兵” T temp = T(FLT_MAX); arrayLeft.push_back(temp); arrayRight.push_back(temp); //定义分别指向两个数组的迭代器 typename vector
::iterator iterLeft = arrayLeft.begin(); typename vector
::iterator iterRight = arrayRight.begin(); //定义指向原数组array的迭代器 typename vector
::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
void mergeSort(vector
&vec, typename vector
::iterator iterHead, typename vector
::iterator iterTail){ //测试 mergeSort 调用了多少次 //static int times_mergeSort=0; //cout<<"the "<<++times_mergeSort<<" call mergeSort()"<
::size_type halfLength = (vec.size()-1)/2; //数组长度的一半(正确方法) typename vector
::difference_type halfLength=( (iterTail-iterHead)-1)/2; //定义一个迭代器指向数组 vec 中间位置 typename vector
::iterator iterDivide = iterHead + halfLength; mergeSort(vec, iterHead, iterDivide+1); //递归调用自身对前半段排序 mergeSort(vec, iterDivide+1, iterTail); //递归调用自身对后半段排序 //cout<<"the "<<++times_subMerge<<" call subMerge()"<
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<
<<" "; cout<

运行结果:

转载于:https://my.oschina.net/u/204616/blog/545258

你可能感兴趣的文章
LogMiner 详解
查看>>
我的友情链接
查看>>
动态语言的灵活性是把双刃剑 -- 以 Python 语言为例
查看>>
启用“QQ在线状态”服务
查看>>
Telnet部署与启动 windows&&linux
查看>>
我的友情链接
查看>>
spark2.x由浅入深深到底系列六之RDD api reduceByKey与foldByKey对比
查看>>
CentOS 下wireless搭建
查看>>
javascript:void(0)
查看>>
spring管理的ehcache缓存没有起做用的原因
查看>>
配置终端服务单一登录
查看>>
我的友情链接
查看>>
使用XHProf查找PHP性能瓶颈
查看>>
Qt 5.x 中文翻译缺失的一种解决办法
查看>>
发布Ext JS 5.1 beta版本
查看>>
我的友情链接
查看>>
连接数过多导致程序连接报错的原因
查看>>
47、【华为HCIE-Storage】--InfoReplicator
查看>>
MPLS_××× 标签分发详解
查看>>
SP2-0750: You may need to set ORACLE_HOME to your Oracle software directory
查看>>