#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;
}