• 合并排序(非哨兵方法)


    //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右边的元素向后移动,导致元素个数增多。

  • 相关阅读:
    nginx能访问html静态文件但无法访问php文件
    LeetCode "498. Diagonal Traverse"
    LeetCode "Teemo Attacking"
    LeetCode "501. Find Mode in Binary Search Tree"
    LeetCode "483. Smallest Good Base" !!
    LeetCode "467. Unique Substrings in Wraparound String" !!
    LeetCode "437. Path Sum III"
    LeetCode "454. 4Sum II"
    LeetCode "445. Add Two Numbers II"
    LeetCode "486. Predict the Winner" !!
  • 原文地址:https://www.cnblogs.com/haigege/p/2299302.html
Copyright © 2020-2023  润新知