快速排序
- 给定一个数组arr,和一个整数num。请把小于等于num的数放在数组的左边,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)
public static void partition1(int[] arrs, int num) {
int small_index = 0
int bigger_index = arrs.length - 1
int index = 0
while (small_index < bigger_index) {
int temp = arrs[index]
if(temp<=num){
arrs[index] = arrs[small_index]
arrs[small_index] = temp
index++
small_index++
}else {
arrs[index] = arrs[bigger_index]
arrs[bigger_index] = temp
bigger_index--
}
}
System.out.println(Arrays.toString(arrs))
}
- 荷兰国旗问题
- 给定一个数组arr,和一个整数num。请把小于num的数放在数组的左边,等于num的数放在中间,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)
public static int[] netherlandsFlag(int[] arr, int L, int R) {
if (L > R) {
return new int[] { -1, -1 }
}
if (L == R) {
return new int[] { L, R }
}
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]) {
swap(arr, index++, ++less)
} else {
swap(arr, index, --more)
}
}
swap(arr, more, R)
return new int[] { less + 1, more }
}
- 随机快排
- 思路:随机获取一个位置的数放在最右端,将整体数组进行荷兰国旗算法返回小于边界和大于边界,再分别对小于区域和大于区域进行排序。
public static void quickSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
process(arr, 0, arr.length - 1);
}
public static void process(int[] arr, int L, int R) {
if (L >= R) {
return;
}
swap(arr, L + (int) (Math.random() * (R - L + 1)), R);
int[] equalArea = netherlandsFlag(arr, L, R);
process(arr, L, equalArea[0] - 1);
process(arr, equalArea[1] + 1, R);
}
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}