快速排序 非递归

这篇博客详细介绍了如何使用非递归的方式实现快速排序算法。通过创建一个栈,将左右边界压入栈中,不断进行分区并调整栈的内容,直到栈为空,实现数组的有序排列。这种方法巧妙地避免了递归调用,降低了内存开销。

快速排序 非递归

思想:

这个非递归很好的利用了快速排序的性质,精髓。

首先我们需要实现一个栈,将right ,left依次的放入栈里面,然后我们就开始操作了。

我们依次取出栈顶两个元素,然后进行 坑位排序,(关键),并且根据返回来的key我们就可以进行重要的操作了;

因为此时key左边的元素都是比key小的,key右边的元素都是比key大的

此时我们就可以以key为边界,将整个数组划分位两部分,一个是key左边的部分,一个是key右边的那部分,然后我们在判断 key-left 是否 >1 因为如果左边或者右边只剩一个元素的话,那么其本身就是有序的了,就不需要在放入栈里面了。

如果 key -left >1 ,此时我们就还是按照第一步的步骤, 依次将 “left” “right [key-1]” “left[key+1]” “right” 放入 栈中,然后继续上面刚开始的那个操作,直到栈为空的时候结束,此时数组就是有序的了

public static void quickSortNonRecursion(int[] nums,int left,int right){
    Deque<Integer> deque=new ArrayDeque<>();
    deque.push(right);
    deque.push(left);
    while (!deque.isEmpty()){
        int begin=deque.pop();
        int end=deque.pop();
        int key=partSort3(nums,begin,end);
        if(end-key>1){
            deque.push(end);
            deque.push(key+1);
        }
        if(key-begin>1){
            deque.push(key-1);
            deque.push(begin);
        }
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

C_x_330

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

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

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

打赏作者

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

抵扣说明:

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

余额充值