算法习题_快速排序的非递归解法

算法习题

著名的快速排序算法对于计算机专业的学生已不陌生,算法是递归实现的。请按照快速排序的思想,设计一个非递归的(即迭代的)快速排序算法。(提示:可利用栈)。

解:

  1)用a[size]存待排序数组,stack[M]存下标。

2)开始时stack[M]存入待排序数组a[size]的起始下标和终止下标。

     3)从stack[]中取出一对起始下标和终止下标,在这两个下标区间内依次读入a[]值,小于枢轴数值x的一律通过交换放在a[]前端。这样就很自然地将数组a[] 分成了小于x的一个子段和大于等于x的一个子段。

     4)两个子段中,有任何一段长度大于1,就将其起始和终止下标压栈。

5)只要栈不空就一直执行上述操作3)4),最终就能完成一个非递归的(即迭代的)快速排序算法

 

代码:

void qSort(inta[], int size)

{

    int stack[M];

    int top=-1;

    stack[++top] = 0;

    stack[++top] = size-1;

    while (top>0)

    {

        int end = stack[top--];

        int start = stack[top--];

        int x = a[end];

        int i = start-1;

        int j = start;

        for (int j = start; j < end; j++)

        {

            if (a[j] < x)

            {

                i++;

                exch(a[i], a[j]);

            }

        }

        swap(a[i+1], a[end]);

        if (start < i)

        {

            stack[++top]=start;

            stack[++top]=i;

        }

        if (i+2 < end)

        {

            stack[++top] = i+2;

            stack[++top] = end;

        }

    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值