快速排序

来源:互联网 发布:精准扶贫数据造假 编辑:程序博客网 时间:2024/05/21 08:59

/* 主题:快速排
* 开发语言: C++
* 开发环境: Virsual Studio 2005
* 时间: 2010.12.09
*/
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <ctime>
#include <windows.h>

using namespace std;
template <class T>
class Sort
{
public:
    Sort (const vector<T>& vsortData, bool bsortMode)
        : m_vsortData(vsortData), m_bsortMode(bsortMode)
    {}
    virtual void QSort()
    {
        __QSort (0, m_vsortData.size() - 1) ;
    }
    // display all element
    void display () const
    {
        for (size_t i = 0; i < m_vsortData.size() / 10; ++ i)
        {
            copy (m_vsortData.begin() + 10 * i,
                  m_vsortData.begin() + 10 * i + 10,
                  ostream_iterator<int>(cout," "));
            cout << endl ;
        }
    }
protected:
    bool __compare (const T& rth, const T& lth)
    {
        return m_bsortMode ? (rth < lth) : (rth > lth) ;
    }
    virtual void __QSort (int istart, int iend)
    {
        if (istart < iend)
        {
            int isegLocation = __partition (istart, iend) ;
            __QSort (istart, isegLocation - 1) ;
            __QSort (isegLocation + 1, iend) ;
        }
    }
    virtual int __partition(int istart, int iend)
    {
        int iinc = istart ;
        int idec = iend ;

        T midData = m_vsortData[iinc] ;
        while (true)
        {
            while (__compare (m_vsortData[iinc], midData) && iinc <= iend)
            {
                ++ iinc ;
            }
            while (__compare (midData, m_vsortData[idec]) && idec >= istart)
            {
                -- idec ;
            }
            if (iinc >= idec)
                break ;
            swap (m_vsortData[iinc], m_vsortData[idec]) ;
            Sleep (100) ;    // 增大交换的代价
        }
        swap (m_vsortData[iinc], m_vsortData[idec]) ;
        return idec ;
    }
    virtual int __getPivot(int istart, int iend) = 0 ;
protected:
    vector<T>  m_vsortData ;
    // true:从小到大,false: 从大到小
    bool       m_bsortMode ;
} ;

template <class T>
class QuickSort : public Sort<T>
{
public:
    QuickSort (const vector<T>& vsortData, bool bsortMode)
        : Sort (vsortData, bsortMode)
    {}
protected:
    virtual int __getPivot(int istart, int iend)
    {
        return istart ;
    }
} ;
template <class T>
class RandomQuickSort : public Sort<T>
{
public:
    RandomQuickSort (const vector<T>& vsortData, bool bsortMode)
        : Sort (vsortData, bsortMode)
    {}
protected:
    virtual int __getPivot(int istart, int iend)
    {
        srand (time(NULL)) ;
        return istart + rand () % (iend - istart) ;
    }
} ;

int main ()
{
    const int size = 100;
    vector<int> sortdata (size) ;
    for (int i = 0; i < size; ++ i)
    {
        sortdata[i] = i ;
    }
    random_shuffle (sortdata.begin(), sortdata.end()) ;
   
    QuickSort<int> qs (sortdata, false) ;
    SYSTEMTIME sys1;
    SYSTEMTIME sys2;

    GetLocalTime(&sys1) ;
    qs.QSort () ;
    GetLocalTime(&sys2) ;

    printf ("%d, %d\n",
        (sys2.wSecond - sys1.wSecond), (sys2.wMilliseconds - sys1.wMilliseconds));

    random_shuffle (sortdata.begin(), sortdata.end()) ;
    // qs.display () ;
    RandomQuickSort<int> rqs (sortdata, true);
    GetLocalTime(&sys1) ;
    rqs.QSort () ;
    GetLocalTime(&sys2) ;

    printf ("%d, %d\n",
        (sys2.wSecond - sys1.wSecond), (sys2.wMilliseconds - sys1.wMilliseconds));

    return 0 ;
}

0 0