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

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

/*  * mergeSort.cpp  *  合并排序算法,算法导论P.17  *  Created on: 2011-12-21  *      Author: LiChanghai */ //#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()"<

    之前在计算数组中间位置的时候,瓜戳戳的用 size_type halfLength = (vec.size()-1)/2

结果只有1个或2个数排序的时候正确,当大于等于3个数时程序总是崩溃,一直检查下面递归调用有没有问题,

看了很久很久也没发现问题,百思不得其解,于是写3个数对程序一句一句的写出来分析,结果错的这么幼稚,

vec.size()是一个恒定的值,所以。。。。。哎,正确的方法是用两个迭代器的差计算子数组的长度,如下:

typename vector<T>::difference_type halfLength=( (iterTail-iterHead)-1)/2

转载于:https://www.cnblogs.com/haigege/archive/2011/12/22/2298491.html

你可能感兴趣的文章
1003. 我要通过!(20)
查看>>
IOS_Sqlite
查看>>
JavaScript基本语法2
查看>>
微信小程序日期选择器
查看>>
多进程
查看>>
截取视频缩略图
查看>>
c# mvc如何生成excel
查看>>
Starship Troopers
查看>>
Atcoder arc079 D Decrease (Contestant ver.) (逆推)
查看>>
Expanding Rods 二分查找(精度很重要)
查看>>
练手小程序之<约瑟芬杀人法>
查看>>
Jenkins_ArchiveBuildFilesForTeam
查看>>
Python之网络编程
查看>>
.Net转Java自学之路—基础巩固篇三十(JDBC)
查看>>
[HeadFirst-HTMLCSS学习笔记][第八章扩大你的词汇量]
查看>>
CF 354E DFS
查看>>
碰到的TypeError--记录
查看>>
Java设计模式之十 ---- 访问者模式和中介者模式
查看>>
redis的持久化(RDB&AOF的区别)
查看>>
8M - 三角形
查看>>