把一个数组分为三个部分,像荷兰的三色旗一样。分别为>、=、<,三个区域。
// 在arr[L..R]上,根据p分块,<p 左边,==p中间,>p右边
// 返回值:长度为2的数组,区域的左边界,右边界
//如果无等 返回值 左>右
// <区 下标 less, >区下标 more, index 当前位置下标
int[] partition(int[] arr,int L,int R,int p)
{
int less=L-1;// <区域右边界
int more=R+1;//>区域左边界
int index=L;
while(index<more)//index是当前数的下标
{
if(arr[index]<p) { swap(arr,++less;index++); }
// 1.区域右扩 先右扩
//2.数据交换 当前位置和区域+1 换 ++less(less=less+1)先移位再操作
//3.当前数跳下一个 index++ 先返回,再++
else if(arr[index]>p) { swap(arr,--more;index); }
//1.区域左移
//2.数据交换 当前位置和区域-1 换--more(more=more-1) 先赋值后操作
//3.当前数不动 index
else { index++;}
//当前数直接跳下一个
}
return new int[] {less+1,more-1};
}
swap(int[] arr,int i,int j)
{
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}