一、荷兰国旗问题
给定一个数组arr,和一个数num,请把小于num的数放在数组的左边(可无序),等于num的放中间,大于num的放在数组右边。
要求:空间复杂度O(1),时间复杂度O(N)
public static void sortnum(int[] arr,int num){
int small=-1;
int big=arr.length;
int current=0;
while(current!=big) {
if (arr[current]<num){
swap(arr,++small,current++);
}
else if (arr[current]==num){
current++;
}
else if(arr[current]>num){
swap(arr,--big,current);
}
}
}
public static void swap(int[] arr,int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
二、快速排序
①快排1.0,时间复杂度O(N²)
取数组最后一个数num,根据这个num,把数组分成两边,左边是≤num的,右边是>num的

然后将num插入到≤中最后一个数后,即num的位置确定了

再将左右两边的区域重复上面两步操作,最后全有序(一次确定一个元素的位置)
②快排2.0,时间复杂度O(N²),基于荷兰国旗问题优化
取数组最后一个数(如最后一个数为5),将数组分成<、=、>三个区域

当排好序后将num和>num的第一个数交换,中间就确定了一批=num的数
最后左右<区和>区的数组继续递归上述过程,最后全部有序(一次确