划分
一. 快速排序的划分
要求:数组划分分左右两部分,左边比pivot小,右边比pivot大
实现过程:1. 定义变量left,right,分别表示未整理的子数组最左和最右的下标。
2、定义游标leftPtr,遍历left部分,初始值为left-1;定义游标rightPtr,遍历right部分,初始值为right+1;
3、++leftPtr,--rightPtr,开始寻找左区第一个大数和右区第一个小数。发现则交换。
4、直至leftPtr>rightPtr, 或leftPtr,rightPtr跳出边界则终止。
public static int[] partition(int[] arr, int left, int right, int pivot){
int leftPtr = left - 1;
int rightPtr = right + 1;
while(true){
while(leftPtr < right && arr[++leftPtr] < pivot)
;
while(rightPtr > left && arr[--rightPtr] > pivot)
;
if(leftPtr >= rightPtr)
break;
else
swap(arr, leftPtr, rightPtr);
}
return arr;
}
二、 另一种划分
要求: 划分为3部分,左边小于pivot, 中间等于pivot,右边大于pivot
实现过程: 1、 定义变量left,表左区最右,初始值left = -1;定义变量index,游标;定义变量right,表右区最左,初始值arr.length;
2、开始遍历。若arr[index] < pivot, 该数放左区,arr[left+1]是中区最左,交换arr[index]和arr[left+1]; index++;
若arr[index] = pivot,index++;
若> pivot, 放右区。arr[right-1]是中区最右,交换arr[index] and arr[right-1];此时arr[right-1]值2未知,index不作变动。
3、当index==right,停止遍历。
public static void partition2(int[] arr, int pivot){
int left = -1;
int right = arr.length;
int index = 0;
while(index != right){
if(arr[index] < pivot){
swap(arr, ++left, index++);
}
else if(arr[index] > pivot)
swap(arr, --right, index);
else
index++;
}
}

浙公网安备 33010602011771号