热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

合并排序(非哨兵方法)

subMerge2----非哨兵方法实现两个有序序列的合并templatevoidsubMerge2(vector&array,typenamevect

//subMerge2----非哨兵方法实现两个有序序列的合并
template
void subMerge2(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);

//定义分别指向两个数组的迭代器
typename vector::iterator iterLeft = arrayLeft.begin();
typename vector::iterator iterRight = arrayRight.begin();

//定义指向原数组array的迭代器
typename vector::iterator iterArray = iterBegin;

//只要其中一个数组为空则跳出循环
while(iterLeft!=arrayLeft.end() && iterRight!=arrayRight.end())
{
if(*iterLeft <*iterRight) //如果左边小&#xff0c;将左边的值放入原数组
{
*iterArray &#61; *iterLeft;
&#43;&#43;iterLeft;
&#43;&#43;iterArray;
}
else //如果右边小&#xff0c;将右边的值放入原数组
{
*iterArray &#61; *iterRight;
&#43;&#43;iterRight;
&#43;&#43;iterArray;
}
}
//左边为空
if(iterLeft&#61;&#61;arrayLeft.end())
{
//将右边剩下的数据复制到原数组
//array.erase(iterArray, iterEnd);
//array.insert(iterArray, iterRight, arrayRight.end());
while(iterRight !&#61; arrayRight.end())
{
*iterArray &#61; *iterRight;
&#43;&#43;iterRight;
&#43;&#43;iterArray;
}
}
//右边为空
if(iterRight&#61;&#61;arrayRight.end())
{
//将左边剩下数据复制到原数组
//array.erase(iterArray, iterEnd);
//array.insert(iterArray, iterLeft, arrayLeft.end());
while(iterLeft !&#61; arrayLeft.end())
{
*iterArray &#61; *iterLeft;
&#43;&#43;iterLeft;
&#43;&#43;iterArray;
}
}
return;
}

用此函数代替之前mergeSort()中的 subMerge即可。其中在将左边或右边剩余元素复制到原数组的时候&#xff0c;如果用 vector成员函数insert&#xff0c;

必须先将iterArray所指位置右边的元素删除&#xff0c;不然会使iterArray右边的元素向后移动&#xff0c;导致元素个数增多。

转:https://www.cnblogs.com/haigege/archive/2011/12/23/2299302.html



推荐阅读
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • hlg_oj_1116_选美大赛这题是最长子序列,然后再求出路径就可以了。开始写的比较乱,用数组什么的,后来用了指针就好办了。现在把代码贴 ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • HDU 2537 键盘输入处理
    题目描述了一个名叫Pirates的男孩想要开发一款键盘输入软件,遇到了大小写字母判断的问题。本文提供了该问题的解决方案及实现方法。 ... [详细]
  • ACM经典书籍推荐
    本文介绍了几本在算法和计算机科学领域具有重要影响力的书籍,包括由Donald E. Knuth编著的《计算机程序设计艺术》第一卷,以及潘氏兄弟的数论经典教材等。这些书籍不仅是学习相关领域的宝贵资源,也是专业人士不可或缺的参考书。 ... [详细]
  • 在学习了Splay树的基本查找功能后,可能会觉得它与普通的二叉查找树没有太大的区别,仅仅是通过splay操作减少了时间开销。然而,Splay树之所以被誉为“序列之王”,主要在于其强大的区间操作能力。 ... [详细]
  • 将XML数据迁移至Oracle Autonomous Data Warehouse (ADW)
    随着Oracle ADW的推出,数据迁移至ADW成为业界关注的焦点。特别是XML和JSON这类结构化数据的迁移需求日益增长。本文将通过一个实际案例,探讨如何高效地将XML数据迁移至ADW。 ... [详细]
  • 本文探讨了在AspNetForums平台中实施基于角色的权限控制系统的方法,旨在为不同级别的用户提供合适的访问权限,确保系统的安全性和可用性。 ... [详细]
  • 本文总结了 #define 在 C/C++ 编程中的多种用途和技巧,包括定义常量、函数、宏以及条件编译等,并提供了详细的示例和注意事项。 ... [详细]
  • 本文针对HDU 1042 N! 问题提供详细的解析和代码实现。题目要求计算给定整数N(0 ≤ N ≤ 10000)的阶乘N!。文章不仅提供了算法思路,还附上了C++语言的具体实现。 ... [详细]
  • binlog2sql,你该知道的数据恢复工具
    binlog2sql,你该知道的数据恢复工具 ... [详细]
  • 本文详细介绍了如何在循环双链表的指定位置插入新元素的方法,包括必要的步骤和代码示例。 ... [详细]
  • 本文介绍如何通过参数化查询来防止SQL注入攻击,确保数据库的安全性。示例代码展示了在C#中使用参数化查询添加学生信息的方法。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • c语言二元插值,二维线性插值c语言
    c语言二元插值,二维线性插值c语言 ... [详细]
author-avatar
一鳞半爪恋歌
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有