编程技术记录

世界你好!

自己都忘了什么时候写的了,@_@

#pragma once

#include <list>
#include <vector>
#include <stack>

using namespace std;

struct Bound
{
    size_t low;
    size_t high;
    Bound(size_t lowind,size_t highind)
    {
        this->low=lowind;
        this->high=highind;
    }
};
template <typename T>
void QSort(vector<T> & vay) //从小到大排序
{
    size_t len=vay.size();
    if( len > 2)
    {
        stack<Bound> boundS;
        Bound bd(0,len-1);
        boundS.push(bd);

        size_t low,high;
        while( ! boundS.empty() ) //当栈不为空时
        {
            bd=boundS.top();//取栈顶元素
            low=bd.low;
            high=bd.high;
            boundS.pop();//弹出栈顶元素

            low++;//用数组的排序部分的首个元素作为关键值,进行比较

            while( true ) //进行二分数组排序
            {
                while( low < high && vay[low] <= vay[bd.low] ) //用数组的排序部分的首个元素作为关键值,进行比较
                {
                    low++;
                }
                while( low < high && vay[high] > vay[bd.low] ) //vay[high] > vay[bd.low] 不能用 >=,因为要二分数组的排序部分,保证两部分的排他性
                {
                    high--;
                }
                if( low < high )
                {//交换低索引和高索引元素
                    T tmp=vay[low];
                    vay[low]=vay[high];
                    vay[high]=tmp;
                }
                else 
                {//此时,low == high 为真
                    break;
                }
            }

            //此时,low == high 为真
            if( vay[low] > vay[bd.low] )
            {
                low--;
            }
            //将关键值插入大元素和小元素的分界
            T tmp=vay[low];
            vay[low]=vay[bd.low];
            vay[bd.low]=tmp;

            if( low - bd.low > 1 ) //若小元素部分元素个数大于1个,继续排序
            {
                Bound newbd(bd.low,low-1);
                boundS.push(newbd);
            }
            if( bd.high - low > 1)//若大元素部分元素个数大于1个,继续排序
            {
                Bound newbd(low+1,bd.high);
                boundS.push(newbd);
            }
        }
    }
    else if( len == 2) //若数组长度为2,直接比较
    {
        if( vay[0] > vay[1] )
        {
            T tmp=vay[0];
            vay[0]=vay[1];
            vay[1]=tmp;
        }
    }
    //若数组长度小于2,不用排序
}

template <typename T>
struct BoundIter
{
    BoundIter(typename list<T>::iterator lowiter,typename list<T>::iterator highiter)
    {
        this->low=lowiter;
        this->high=highiter;
    }
    typename list<T>::iterator low;
    typename list<T>::iterator high;
};

template <typename T>
void QSort(list<T> & lst) //从小到大排序
{
    if( lst.size() > 2)
    {
        stack<BoundIter<T>> boundIterS;
        BoundIter<T> bd(lst.begin(),(--lst.end()));
        boundIterS.push(bd);

        list<T>::iterator low,high;
        while( ! boundIterS.empty() ) //当栈不为空时
        {
            bd=boundIterS.top();//取栈顶元素
            low=bd.low;
            high=bd.high;
            boundIterS.pop();//弹出栈顶元素

            low++;//用数组的排序部分的首个元素作为关键值,进行比较

            while( true ) //进行二分数组排序
            {
                while( low != high && *low <= *(bd.low) ) //用数组的排序部分的首个元素作为关键值,进行比较
                {
                    low++;
                }
                while( low != high && *high > *(bd.low) ) //*high > *(bd.low) 不能用 >=,因为要二分数组的排序部分,保证两部分的排他性
                {
                    high--;
                }
                if( low != high )
                {//交换低索引和高索引元素
                    T tmp=*low;
                    *low=*high;
                    *high=tmp;
                }
                else 
                {//此时,low == high 为真
                    break;
                }
            }

            //此时,low == high 为真
            if( *low > *bd.low )
            {
                low--;
            }
            //将关键值插入大元素和小元素的分界
            T tmp=*low;
            *low=*bd.low;
            *bd.low=tmp;

            if( low != bd.low ) 
            {//若小元素部分元素个数大于1个,继续排序
                low--;
                if( low != bd.low )
                {
                    BoundIter<T> newbd(bd.low,low);
                    boundIterS.push(newbd);
                }
                low++;
            }
            if( low != bd.high)
            {//若大元素部分元素个数大于1个,继续排序
                low++;
                if( low != bd.high )
                {
                    BoundIter<T> newbd(low,bd.high);
                    boundIterS.push(newbd);
                }
            }
        }
    }
    else if( lst.size() == 2) //若数组长度为2,直接比较
    {
        list<T>::iterator iter0=lst.begin();
        list<T>::iterator iter1=(++lst.begin());
        if( *iter0 > *iter1 )
        {
            T tmp=*iter0;
            *iter0=*iter1;
            *iter1=tmp;
        }
    }
    //若数组长度小于2,不用排序
}

© Beli. All Rights Reserved.