荷兰国旗问题(给出划分值的partition)

12 篇文章 0 订阅
public class NeitherLandFlag {


    /**
     *
     * @param arr 目标数组
     * @param L   需要分组的范围的左边界
     * @param R   需要分组的范围的右边界
     * @param p   划分值
     * @return
     */
    public int[] partition(int[] arr,int L,int R,int p){

        //小于区的指针
        int less = L-1;

        //大于区的指针
        int more = R+1;

        //当前数的指针
        int curr = L;

        //终止条件:当前数到达大于区的边界
        while(curr < more){

            //当前数小于划分值时,当前数与小于区指针的下一位交换,小于区向右扩一位,当前数跳下一位
            if(arr[curr]<p){
                swap(arr,++less,curr++);
            }else if(arr[curr]>p){ //当前数大于划分值,当前数和大于区指针的前一位交换,大于区向左扩一位,当前数位置不变(因为交换过来的数是未知的数)
                swap(arr,--more,curr);
            }else { //当前数等于划分值,当前数往后跳一位
                curr++;
            }
        }


        //返回一个数组,该数组的两个值分别是,等于区的两个边界
        //当无等于区域时,less+1 > more-1 。
        return new int[] {less+1,more-1};
    }


    private static void swap(int[] arr,int i,int j){

        
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值