蜗牛柠檬
慢悠悠的蜗牛也会酸你们疯狂内卷后的优秀~
⌛ 沉淀
经历过的才最真实,何其宝贵之记录必须写写.
🚀 别卷了
我就慢慢来,躺平的快乐你们在医院躺平的时候大概才懂.
🎯 持久
正所谓活到老学到老,请问学习这件事您持久吗?
🔪 小试牛刀
# 荷兰国旗
小于等于目标数字的放左边,大于目标数字的放右边
实现思路:
- 标记小于等于目标数据的位置,命名为左边界位置,当出现目标数据,向右移动一位
- 当出现大于目标数据时,左边界位置不变,继续向右寻找,直至找到目标数据,将左边界位置向右移动,并将当前找到的目标数据与最新左边界位置的数据做交换
TALK IS CHEAP
/**
* 小于等于目标数字在左边,大于在右边
*/
@Test
public void heLanQi() {
int[] arr = {1, 3, 3, 5, 6, 7, 8, 4, 5, 2, 5};
// 目标数字 5
int target = 5;
// 左边边界
int left = -1;
for (int i = 0; i < arr.length; i++) {
if (arr[i] <= target) {
left++;
if (i != left) {
arr[i] = arr[i] ^ arr[left];
arr[left] = arr[i] ^ arr[left];
arr[i] = arr[i] ^ arr[left];
}
}
}
System.out.println(Arrays.toString(arr));
}
扩展:小于放左边 等于放中间 大于放右边
小于边界位置
大于边界位置
如果小于,小于边界位置向右移动,并将当前游标所指数字与最左边界数字交换,游标继续向右
如果等于,位置均不变,游标继续向右
如果大于,大于边界位置向左移动,并将当前游标所指数字与最左边界数字做交换,游标位置不+1,继续循环比较
/**
* 小于目标数字在左边,等于目标数字在中间,大于目标数字在右边
*/
@Test
public void heLanQiExtend() {
int[] arr = {1, 3, 3, 5, 6, 7, 8, 4, 5, 2, 5};
// 左边界
int left = -1;
// 有边界
int right = arr.length;
// 目标数字
int target = 5;
for (int i = 0; i < arr.length; i++) {
if (i == right) {
break;
}
if (arr[i] < target) {
left++;
if (i > left) {
arr[i] = arr[i] ^ arr[left];
arr[left] = arr[i] ^ arr[left];
arr[i] = arr[i] ^ arr[left];
}
}
if (arr[i] > target && i < right) {
right--;
arr[i] = arr[i] ^ arr[right];
arr[right] = arr[i] ^ arr[right];
arr[i] = arr[i] ^ arr[right];
i--;
}
}
System.out.println(Arrays.toString(arr));
}
快去想想快速排序如何实现吧~