荷兰国旗问题
1. 给定一个数组arr,和一个num,请把小于等于num的数放在数组的左边,大于num的数放在数组的右边,要求额外空间复杂度O(1),时间复杂度O(N)
private static void partitionTwo(int[] arr, int num) {
int left = -1;
int cursor = 0;
//小于等于区向前推进,他走过的长度就是数组的长度
while (cursor < arr.length) {
//如果当前值比临界区值要小,与交换小于等于区下一个数交换,
// 那么小于等于区向前挪动一位,cursor跳下一位
if (arr[cursor] <= num) {
swap(arr, ++left, cursor++);
} else {
//如果当前值比临界区小,小于等于区不动,当前值跳下一位
cursor++;
}
}
}
2. (荷兰国旗问题)给定一个数组和一个num,请把小于num的数放在数组左边,等于num的数放在数组的中间,大于num的数放在数组右边。要求额外空间复杂度O(1),时间复杂度O(N).
小于区域推右走,大于区域往左走,小于区域推着区大于区域回合,大于区左边界与当前位置相等 停
private static void partitionThree(int[] arr, int num) {
int left = -1;
int cursor = 0;
int right = arr.length;
//游标和大于等于区碰头了,说明所有的数都已经遍历一遍了
while (cursor < right) {
//如果当前这个数要于num,那么他和小于等于区位置下一个数交换,cursor跳下一位
if (arr[cursor] < num) {
swap(arr, ++left, cursor++);
//当前数和右边大于区下一个数交换,cursor不跳,万一交换完比他还大呢
} else if (arr[cursor] > num){
swap(arr, cursor, --right);
} else {
//等于的话小于区、大于区不动,继续走
cursor++;
}
}
}
3. 首先介绍一下快排的演变历史
1)快排1.0时候把最后一个值当作划分值,然后左右两侧递归
2 ) 快排2.0 把最后一个数作为划分值,等于划分值的不动,大于、小于作递归
3 ) 等概率随机选一个数作为划分值,最好的情况是取到的位置近似在左边中点,最右边中点,最好是O(logN),最坏是O(N)。时间复杂度最好是O(N) *logN,L>R 随机选一个与R交换,
R-L+1与R随机交换,然后左右两部分进行递归。
- 划分值越靠近两侧,复杂度越高;划分值越靠近中间复杂度越低
private static void quickSort(int[] arr, int left, int right) {
if (left >= right) {
return;
}
int randomNum = new Random().nextInt(right - left + 1);
//随机找一个数做partition
swap(arr, left + randomNum, right);
//选右面的数进行partition,然后找到最大值和最小值,分别递归
int[] partitions = partition(arr, left, right);
quickSort(arr, left, partitions[0] - 1);
quickSort(arr, partitions[1] + 1, right);
}
private static int[] partition(int[] arr, int L, int R) {
//如果长度小于2不需要做partition
if (arr == null || arr.length < 2) {
return arr;
}
//从L到R做prtition,划分小于区、大于区
int num = arr[R];
int right = R;
int cursor = L;
int left = L - 1;
while (cursor < right) {
if (arr[cursor] < num) {
swap(arr, cursor++, ++left);
} else if (arr[cursor] > num) {
swap(arr, cursor, --right);
} else {
cursor++;
}
}
//做好分裂后,进行将最后边与right交换位置那么就变成中间都是小于等于区,右面都是大于的了。
swap(arr, R, right);
return new int[]{left + 1, right - 1};
}