快速排序 非递归
思想:
这个非递归很好的利用了快速排序的性质,精髓。
首先我们需要实现一个栈,将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);
}
}
}
这篇博客详细介绍了如何使用非递归的方式实现快速排序算法。通过创建一个栈,将左右边界压入栈中,不断进行分区并调整栈的内容,直到栈为空,实现数组的有序排列。这种方法巧妙地避免了递归调用,降低了内存开销。
1万+

被折叠的 条评论
为什么被折叠?



