荷兰国旗问题,也是快排三路划分的实现,将nums[]中所有比target小的数放在左变,中间是target,右边是所有比target大的数
思想:只有相等时才移动cur指针,不等时不移动cur指针只进行交换,因为交换来的数我们并不知它与target的大小关系,所以我们要对现在这个cur位置上刚被换过来的数再进行比较
时间复杂度O(n)
import java.util.*;
public class Main{
public static void swap(int[]nums,int l,int r){
int temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
}
public static void threeWayPartition(int[]nums,int target){
int len = nums.length;
if(len<=1)return;
int l = -1,r = len,cur = 0;//[0,l]表示当前比target的区间,[r,n-1]表示所有比target大的区间
while(cur<r){
if(nums[cur]<target){
swap(nums,++l,cur);
}else if(nums[cur]>target){
swap(nums,--r,cur);
}else{//只有相等时才移动cur指针,不等时不移动cur指针只进行交换,因为交换来的数我们并不知它与target的大小关系,所以我们要对现在这个cur位置上刚被换过来的数再进行比较
cur++;
}
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt(),target = in.nextInt();
int[] nums = new int[n];
for(int i=0;i<n;i++){
nums[i] = in.nextInt();
}
in.close();
threeWayPartition(nums,target);
for(int x:nums){
System.out.print(x+" ");
}
}
}