/**********************************
* 快速排序演示程序
* 陈宗权
**********************************/
#include <iostream>
#include <ctime>
using namespace std;
#include <stack>
void swap( int*a, int*b )//通过地址交换两个数据
{
int t = *a;
*a = *b;
*b = t;
}
/*void sort( int* a, int n )//快速排序函数
{
if( n<=2 ){//不超过两个数据就处理完毕
if( n==2 && a[1] < a[0] ) swap(a, a+1);
return;
}
swap( a, a+(n>>1) );//把中间的那个数据交换到最前面
int pivot=*a;//以现在最前面的数据作为分界值
int* l=a+1;//左边第二个数据
int* r=a+n-1;//右边最后一个数据
while( l<r )//把数据分组
{
//小于分界值的留在左边,遇到不小于的停止
while( l<r && *l<pivot ) l++;
//不小于分界值的留在右边,遇到小于的停止
while( r>a && *r>=pivot ) r--;
//交换这两个数据
if( l<r ) swap( l, r );
}
//把分界值交换回中间位置
if( *a > *r ) swap( a, r );
//对左右两组分别递归排序
sort( a, r-a );
sort( r+1, n-1-(r-a) );
}
*/
struct Param{
int* a;
int n;
};
void sort(int* a, int n )//快速排序函数非递归版本
{
stack<Param> sp;
Param pm;
for(;;){
if( n<=2 ){//不超过两个数据就处理完毕
if( n==2 && a[1] < a[0] ) swap(a, a+1);
if(sp.empty()) break;//如果栈中没有待排序数据就退出
pm = sp.top();//如果栈中有待排序数据就取出最后入栈的一段
sp.pop();
a = pm.a;
n = pm.n;
continue;
}
swap( a, a+(n>>1) );//把中间的那个数据交换到最前面
int pivot=*a;//以现在最前面的数据作为分界值
int* l=a+1;//左边第二个数据
int* r=a+n-1;//右边最后一个数据
while( l<r )//把数据分组
{
//小于分界值的留在左边,遇到不小于的停止
while( l<r && *l<pivot ) l++;
//不小于分界值的留在右边,遇到小于的停止
while( r>a && *r>=pivot ) r--;
//交换这两个数据
if( l<r ) swap( l, r );
}
//把分界值交换回中间位置
if( *a > *r ) swap( a, r );
//对左右两组分别非递归排序
pm.a=r+1, pm.n=n-1-(r-a);
sp.push(pm);
n = r-a;
}
}
int main(int argc, char *argv[])
{
const int NUM=10240;
int a[NUM];
time_t t1, t2;
for( int i=0; i<NUM; i++ )
a[i] = NUM-i;
for( int i=0; i<10; i++ )
cout << a[i] << ' ';
cout << endl;
t1 = time(NULL);
sort( a, NUM );
t2 = time(NULL);
cout << "time:" << t2-t1 << endl;
for( int i=0; i<50; i++ )
cout << a[i] << ' ';
cout << endl;
return 0;
}