荷兰国旗与快排问题

  • 主要是记录用同一个思路,解决2个问题。

荷兰国旗问题

int[] nums = {1,2,3,4,6,7,10,9,123,3}
int target = 10;
//以target为界分成 三个区域
  private int[] edges(int[] nums, int L, int R, int target) {
    //定义一个左边界less
    int less = L - 1;
    int more = R + 1;
    int cur = L;
    //只要当前值不超过more
    while (cur < more) {
      //如果cur < target,那么less扩一位
      //如果=的话,cur++
      if (nums[cur] < target) {
        less++;
        //把less下一位的值拿过来
        int temp = nums[less];
        nums[less] = nums[cur];
        nums[cur] = temp;
        cur++;
      } else if (nums[cur] > target) {
        //换过来的值依旧是可能> target的,因此cur不能移动,需要继续考察这个cur
        int temp = nums[cur];
        more--;
        nums[cur] = nums[more];
        nums[more] = temp;
      } else {
        //只是当前值++
        cur++;
      }
    }
        return new int[]{less, more};
  }

快排

  • 经典快排中一般每次以数组尾部元素作为标杆。
  • 一次只处理一个元素,利用荷兰国旗问题或许一次可以处理一批元素=标杆的问题。
  • 主要是使用荷兰国旗的代码,来完成快排。从而只需要掌握使得一套代码。


  private void quickSort(int[] nums) {
    if (nums.length < 2) {
      return;
    }
    quickSort(nums, 0, nums.length - 1);
  }

  private void quickSort(int[] nums, int L, int R) {
    if (nums == null || L >= R) {
      return;
    }

    int[] ints = edges1(nums, L, R);
    quickSort(nums, L, ints[0] - 1);
    quickSort(nums, ints[1] + 1, R);
  }

  private int[] edges1(int[] nums, int L, int R) {
    //定义一个左边界less
    int less = L - 1;
    int target = nums[R];
    int more = R;
    int cur = L;
    //只要当前值不超过more
    while (cur < more) {
      //如果cur < target,那么less扩一位
      //如果=的话,cur++
      if (nums[cur] < target) {
        less++;
        //把less下一位的值拿过来
        int temp = nums[less];
        nums[less] = nums[cur];
        nums[cur] = temp;
        cur++;
      } else if (nums[cur] > target) {
        //换过来的值依旧是可能> target的,因此cur不能移动,需要继续考察这个cur
        int temp = nums[cur];
        more--;
        nums[cur] = nums[more];
        nums[more] = temp;
      } else {
        //只是当前值++
        cur++;
      }
    }
    //最后交互一个R和more
    int temp = nums[R];
    nums[R] = nums[more];
    nums[more] = temp;
    return new int[]{less + 1, more};
  }

注意点

  • 在寻找边缘数组中,more和less的初始值和返回值不太一样,主要是荷兰国旗中给定的target不一定在原数组中,因此荷兰国旗问题的less = L-1,more = R+1,即初始化成不存在的值。快排中标杆以最后一个元素作为target,这个值一定存在,因此more = R初始。
  • 在返回less,more的数组中,其中[less+1,more]是值 = target的区间。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值