C++快速排序的递归和非递归形式示例

/**********************************
* 快速排序演示程序
* 陈宗权
**********************************/
#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;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bryan Ding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值