给定一个数组和一个num数,把小于num的放在数组的左边,等于num的放中间,大于num的放右边。
给两个变量,一个(less)指向小于数组的最后一个数,另一个(more)指向大于数组中的第一个数,也就是维护了两个区域,一个是小于区域,一个是大于区域。
1.当cur小于num时,cur指向的就和++less指向的交换,同时cur++;
2.当cur==num时,cur++;
3.当cur大于num时,cur指向的就和–more指向的交换。
最后数组返回的是等于num的数组的起始和终止的索引。
public static int[] partition(int[] arr,int L,int R,int num) {
if(arr==null||arr.length<2)
return arr;
int less=L-1;
int more=R+1;
int cur=L;
while(cur<more)
{
if(arr[cur]<num)
swap(arr, ++less, cur++);
else if(arr[cur]>num)
swap(arr, cur, --more);
else
cur++;
}
return new int[] {less+1,more-1};
}