【好记性不如烂笔头】排序算法之快速排序(一)荷兰旗问题

前言

  这节学习一下荷兰旗问题,为学习快排打一个基础。

🤨题意解析👇

  荷兰旗我还没见过呢?赶紧搜一下瞅瞅:

查看源图像

  这就是荷兰旗,三色啊🤔那啥叫荷兰旗问题呢,来个例子,我有一个数组arr,还有一个数X,数组中所有小于X的放数组左边,等于X的放数组中间,大于X的放数组右边,这就是荷兰旗问题。

😊图解思路👇

  造一个题呗,图来🤺

在这里插入图片描述

  暴力思路来一次👉

在这里插入图片描述

  整理下:

  • 有个交换动作,来个swap
  • 我需要左边界L
  • 我需要右边界R
  • 考虑边界L>=R

❤️代码实现👇

  话不多说,贴上代码:

	/**
	 * arr[L...R] 玩荷兰国旗问题的划分,以arr[R]做划分值 <arr[R] ==arr[R] > arr[R]
	 * 
	 * @param arr 数组
	 * @param L   左边界
	 * @param R   右边界
	 * @return 下标范围
	 */
	public static int[] netherlandsFlag(int[] arr, int L, int R) {
		if (L > R) { // L...R L>R,不是有效范围
			return new int[] { -1, -1 };
		}
		if (L == R) {
			return new int[] { L, R };
		}
		// 可以从初始位理解,刚开始的时候,左边界还没有右扩,所以less是L-1
		int less = L - 1; // < 区 右边界
		int more = R; // > 区 左边界
		int index = L;
		// 当前数的位置,不能和 右区的左边界撞上
		while (index < more) {
			if (arr[index] == arr[R]) {// 当前位置的数 和 目标数 相等的时候跳过
				index++;
			} else if (arr[index] < arr[R]) {// 当前位置的数 小于 目标数
				// 当前位置的数 和 L+1的数交换,然后位置右移,左边界右移
				swap(arr, index++, ++less);
			} else { // >
				// 当前位置的数 和 R-1的数交换,然后位置不变,右边界左移
				swap(arr, index, --more);
			}
		}
		//more是右边界-1的位置,和R交换
		swap(arr, more, R); // <[R] =[R] >[R]
		//等于区域的第一个数的位置,和等于区域的最后一个数的位置
		return new int[] { less + 1, more };
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泪梦殇雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值