荷兰国旗问题
引言:问题一
给定一个数组arr,和一个数num,请把小于等于num的数放在数组的左边,大于num的数放在数组的右边,要求额外空间复杂度O(1),时间复杂度O(N)
//荷兰国问题1.0,给定一个数,小于等于这个数的数放数组左边,大于这个数的放数组右边
public void process(int [] arr,int a){
if (arr != null && arr.length < 2){
return;
}
int i = 0; //指针
int min = 0; //小于等于区域的空间
while(i< arr.length){
if (arr[i] <= a) swap(arr,i++,min++);
else i++;
}
}
private void swap(int[] arr, int i, int j) {
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
问题二
给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组中间,大于num的数放在数组的右边,要求额外空间复杂度O(1),时间复杂度O(N)
//荷兰国问题2.0,给定一个数,小于这个数的数放数组左边,等于这个数的数放数组中间,大于这个数的放数组右边
public void process1(int [] arr,int a){
if (arr != null && arr.length < 2){
return;
}
int i = 0; //指针
int min = 0; //小于区域的空间
int max = 0; //大于区域的空间
while (i < (arr.length-max)){
if (arr[i]
快速排序:利用荷兰国问题2.0思想,将数组分为小于最后一个数,和等于最后一个数和大于最后一个数3个区域,然后等于区域就不用动,递归小于区域和大于区域重复上门步骤
//快排2.0 时间复杂度O(N²),因为当数组有序时,情况最差
public void quicksort(int [] arr,int l,int r) {
if (l < r) {
int[] p = partition(arr, l, r);
quicksort(arr, l, p[0] - 1);
quicksort(arr, p[1] + 1, r);
}
}
//将数组进行划分
public int[] partition(int [] arr,int l,int r){
int min = l; //小于的边界
int max = r; //大于的边界
int i = l; //i从l开始
int t = arr[r]; //每次拿出最后一个数作为划分的标准
//划分
while (i



