快速排序

#include <iostream>
using namespace std;

/* 快速排序
** 思想:采用了分治策略,选用数组任一记录(一般为第一个)为Pivot
** 根据这个Pivot,将数组分为左、右两个较小的子区间,且左边记录的关键字
** 均小于等于Pivot的关键字,右边记录的关键字均大于等于Pivot的关键字
** 以此思想递归之。
** 注:Pivot可翻译为支点
*/

int a[] = { 49, 38, 65, 97, 76, 13, 27, 49 };

void swap( int & lValue, int & rValue )
{
    int temp = lValue;
    lValue = rValue;
    rValue = temp;

    return;
}

// 一次划分
int Partition( int * Sq, int low, int high )
{
    int pivotkey = Sq[low];

    while ( low < high )
    {
        while ( low < high && Sq[high] >= pivotkey )
        {
            --high;
        }
        swap( Sq[low], Sq[high] );
        while ( low < high && Sq[low] <= pivotkey )
        {
            ++low;
        }
        swap( Sq[low], Sq[high] );
    }

    return low;
}

// 更高效率的划分
int Partition1( int * Sq, int low, int high )
{
    int temp = Sq[low];
    int pivotkey = Sq[low];

    while ( low < high )
    {
        while ( low < high && Sq[high] >= pivotkey )
        {
            --high;
        }
        Sq[low] = Sq[high];
        while ( low < high && Sq[low] <= pivotkey )
        {
            ++low;
        }
        Sq[high] = Sq[low];
    }

    Sq[low] = temp;

    return low;
}

void QSort( int * Sq, int low, int high )
{
    if ( low < high )
    {
        int pivotloc = Partition1( Sq, low, high );
        QSort( Sq, low, pivotloc - 1 );
        QSort( Sq, pivotloc + 1, high );
    }
    return;
}

int main()
{
    QSort( a, 0, 7 );

    for ( int i = 0; i < 8; ++i )
    {
        cout << a[i] << endl;
    }

    return 0;
}
posted @ 2012-04-25 23:48  木愚  阅读(203)  评论(0编辑  收藏  举报