将一个数组从L到R分成左边小于等于某个数,右边大于某个数
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//arr[L..R]上,以arr[R]位置的数做划分值
// 小于等于 | 大于
//返回作为划分值那个数的位置
public static int partition(int[] arr, int L, int R) {
if (arr == null || L > R) {
return -1;
}
if (L == R) {
return L;
}
int lessEqual = L - 1;//小于区
int cur = L;
while (cur < R) {
//遇到大于的,当前数直接跳下一个
//遇到小于等于的,和小于区下一个数交换
//小于区向右扩,当前数跳
if (arr[cur] <= arr[R]) {
swap(arr, ++lessEqual, cur);
}
cur++;
}
swap(arr, R, ++lessEqual);
return lessEqual;
}
将一个数组从L到R分成左边小于某个数,中间等于某个数,右边大于某个数
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//arr[L..R]上,以arr[R]位置的数做划分值
//小于区 | 等于区 | 大于区
//返回作为划分值的那个数(可能有多个)的位置区间[]
public static int[] partition2(int[] arr, int L, int R) {
if (arr == null || L > R) {
return null;
}
if (L == R) {//只有一个数
return new int[]{L, R};
}
int less = L - 1;//小于区
int cur = L;//当前
int more = R;//大于区
while (cur < more) {//碰上大于区就停止
//遇到等于,当前数直接跳
//遇到小于,和小于区后一个交换,小于区扩大,当前数跳
//遇到大于,和大于区下一个数交换,扩大大于区,当前数不动
if (arr[cur] == arr[R]) {
cur++;
} else if (arr[cur] < arr[R]) {
swap(arr, cur++, ++less);
} else {
swap(arr, cur, --more);
}
}
swap(arr, R, more);
return new int[]{less + 1, more};
}