快速排序的非递归实现

来源:互联网 发布:mac上的大型网游 编辑:程序博客网 时间:2024/06/06 03:41

                 (1)思路

                    继续使用adjust进行划分,如果其中的元素不止1个,那么将下标的开始和结束入栈,否则不入栈

                 (2)代码

private void quickSortNR(int[] a, int begin, int end) {if(begin<end){Stack<Integer> stack = new Stack<Integer>();int mid = adjustNR(a,begin,end);if(begin<mid-1)                        //左边区间不止1个元素{stack.push(begin);            //下标起点入栈stack.push(mid-1);            //下标终点入栈}if(end>mid+1)                          //右边区间不止一个元素{stack.push(mid+1);stack.push(end);}while(!stack.isEmpty()){int tail = stack.pop();          //因为终点是后保存的,所以终点先出栈int head = stack.pop();int midx = adjustNR(a, head, tail);if(head<midx-1){stack.push(head);stack.push(midx-1);}if(tail>midx+1){stack.push(midx+1);stack.push(tail);}}}}private int adjustNR(int[] a, int begin, int end) {int flag = a[begin];while(begin<end){while(begin<end && a[end]>=flag)end--;if(begin<end)a[begin] = a[end];while(begin<end && a[begin]<=flag)begin++;if(begin<end)a[end] = a[begin];}a[begin] = flag;return begin;}

                 (3)测试

int[] a = {16, 105, 3, 31, 61, 50, 61, 80, 78, 4};quickSortNR(a,0,a.length-1);for(int x:a)System.out.print(x+" ");
                           结果为:

3 4 16 31 50 61 61 78 80 105 

0 0