//快速排序的非递归版本

//快速排序的非递归版本
package quickSort;

import java.util.Stack;

/**
 * @author 真他喵的学不动咯
 * @create 2022-08-19--20:52
 */
public class quictwo {   //快速排序的非递归版本

    public static class Job{
        public int L;
        public int R;
        public Job(int left,int right){
            L=left;
            R=right;
        }
    }
    //分层【用了递归】
    public static int[] partition(int[] arr, int L, int R){
        /*
        arr[L,...,R],arr[R做划分值
        L......R
        <  =   >
         */
        int lessR=L-1; //L-1为左边预备区域
        int moreL=R;   //R是右边第一区域
        int index=L;  //L是左边第一轮开始的地方,从L开始遍历
        while (index<moreL){
            if (arr[index]<arr[R]){
                swap(arr,++lessR,index++);
            }
            else if (arr[index]>arr[R]){
                swap(arr,--moreL,index);
            }else{
                index++;
            }
        }
        swap(arr,moreL,R);   //moreL和最后一个数进行了交换,所以下一句直接就是moreL,而不是moreL-1
        return new int[]{lessR+1,moreL};    //lessR+1 是等于区域的第一个,moreL是等于区域的最后一个
    }
    public static void swap(int[] arr,int i,int j){
        int temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
    }
    public static void quicksort2(int[] arr){
        if (arr==null||arr.length<2){
            return;
        }
        Stack<Job> stack=new Stack<>();  //把Job放入栈
        stack.push(new Job(0,arr.length-1));  //在0~N上排序
        while (!stack.isEmpty()){  //栈中不为空,就一直做
            Job cur=stack.pop();
            int L=cur.L;
            int R=cur.R;
            int[] equals=partition(arr,L,R);  //知道左任务、右任务,在栈然后一直做
            //equals返回等于区域
            if (equals[0]>cur.L){   //此时有小于区域
                stack.push(new Job(cur.L,equals[0]-1));
            }
            if (equals[1]<cur.R){      //此时有大于区域
                stack.push(new Job(equals[1]+1,R));
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值