question1:
给定一个数组arr和一个数num,让大于这数的数字放在数组的右边,小于等于这个数字放在数组的左边。 要求:时间复杂度O(n),额外空间复杂度O(1)。
/*
* 小于等于在一区
*/
public static void question(int[] arr, int num) {
int slow = -1, fast = 0;
while (fast < arr.length) {
if (arr[fast] <= num) {
swap(arr, slow+1, fast);
slow++;
}
fast++;
// System.out.println(Arrays.toString(arr));
}
}
question2:荷兰国旗问题
给定一个数组arr和一个数num,让大于这数的数字放在数组的右边,小于这个数字放在数组的左边,等于这个数字放在数组的中间。 要求:时间复杂度O(n),额外空间复杂度O(1)。
public static void question2(int[] arr, int num) {
int right = arr.length, left = -1;
for (int cur = 0; cur < arr.length && cur < right;) {
if (arr[cur] < num) {
swap(arr, cur, left + 1);
++left;
++cur;
} else if (arr[cur] > num) {
swap(arr, cur, right - 1);
--right;
} else {
// arr[i] == num pass
++cur;
}
}
}
快排:
public static void quickSort(int[] arr){
if (arr == null || arr.length < 2){
return;
}
quickSort(arr,0,arr.length-1);
}
private static void quickSort(int[] arr,int L,int R){
int pivot = partition(arr,L,R);
quickSort(arr,L,pivot-1);
quickSort(arr,pivot+1,R);
}
private static int partition(int[] arr, int L, int R){
int pivot = arr[R];
int i = L, temp = 0;
for(int j = L;j<R;j++){
if(arr[j] < pivot){
temp = arr[j];
arr[j] = arr[i];
arr[i++] = temp;
}
}
temp = arr[i];
arr[i] = arr[R];
arr[R] = temp;
return i;
}