荷兰国旗问题

将一个数组从L到R分成左边小于等于某个数,右边大于某个数

private static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

//arr[L..R]上,以arr[R]位置的数做划分值
// 小于等于  |  大于
//返回作为划分值那个数的位置
public static int partition(int[] arr, int L, int R) {
    if (arr == null || L > R) {
        return -1;
    }
    if (L == R) {
        return L;
    }
    int lessEqual = L - 1;//小于区
    int cur = L;
    while (cur < R) {
        //遇到大于的,当前数直接跳下一个
        //遇到小于等于的,和小于区下一个数交换
        //小于区向右扩,当前数跳
        if (arr[cur] <= arr[R]) {
            swap(arr, ++lessEqual, cur);
        }
        cur++;
    }
    swap(arr, R, ++lessEqual);
    return lessEqual;
}

将一个数组从L到R分成左边小于某个数,中间等于某个数,右边大于某个数

private static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}
//arr[L..R]上,以arr[R]位置的数做划分值
//小于区 |  等于区  |  大于区
//返回作为划分值的那个数(可能有多个)的位置区间[]
public static int[] partition2(int[] arr, int L, int R) {
    if (arr == null || L > R) {
        return null;
    }
    if (L == R) {//只有一个数
        return new int[]{L, R};
    }
    int less = L - 1;//小于区
    int cur = L;//当前
    int more = R;//大于区
    while (cur < more) {//碰上大于区就停止
        //遇到等于,当前数直接跳
        //遇到小于,和小于区后一个交换,小于区扩大,当前数跳
        //遇到大于,和大于区下一个数交换,扩大大于区,当前数不动
        if (arr[cur] == arr[R]) {
            cur++;
        } else if (arr[cur] < arr[R]) {
            swap(arr, cur++, ++less);
        } else {
            swap(arr, cur, --more);
        }
    }
    swap(arr, R, more);
    return new int[]{less + 1, more};
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值