public class NeitherLandFlag {
/**
*
* @param arr 目标数组
* @param L 需要分组的范围的左边界
* @param R 需要分组的范围的右边界
* @param p 划分值
* @return
*/
public int[] partition(int[] arr,int L,int R,int p){
//小于区的指针
int less = L-1;
//大于区的指针
int more = R+1;
//当前数的指针
int curr = L;
//终止条件:当前数到达大于区的边界
while(curr < more){
//当前数小于划分值时,当前数与小于区指针的下一位交换,小于区向右扩一位,当前数跳下一位
if(arr[curr]<p){
swap(arr,++less,curr++);
}else if(arr[curr]>p){ //当前数大于划分值,当前数和大于区指针的前一位交换,大于区向左扩一位,当前数位置不变(因为交换过来的数是未知的数)
swap(arr,--more,curr);
}else { //当前数等于划分值,当前数往后跳一位
curr++;
}
}
//返回一个数组,该数组的两个值分别是,等于区的两个边界
//当无等于区域时,less+1 > more-1 。
return new int[] {less+1,more-1};
}
private static void swap(int[] arr,int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
荷兰国旗问题(给出划分值的partition)
最新推荐文章于 2021-09-01 18:01:37 发布