zoukankan      html  css  js  c++  java
  • 合并排序(非哨兵方法)

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

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

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

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

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

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

  • 相关阅读:
    angular ng-bind-html异常Attempting to use an unsafe value in a safe context处理
    JS执行机制详解,定时器时间间隔的真正含义
    es6入门4--promise详解
    es6入门3--箭头函数与形参等属性的拓展
    JS判断滚动条到底部,页面是否有滚动条
    js forEach跳出循环
    es6入门2--对象解构赋值
    前端开发与日常好玩的的小工具,网站与插件分享
    详解 线程池
    详解 volatile关键字 与 CAS算法
  • 原文地址:https://www.cnblogs.com/haigege/p/2299302.html
Copyright © 2011-2022 走看看