Partition
小于等于区,大于区域
当前值下标,小于等于区域边界下标
当前值小于等于划分值,交换当前值,与小于等于区域下标, 当前值下标++,小于等于下标++
当前值大于划分值,跳过
时间O(N),额外空间O(1)
扩展:荷兰国旗问题
1)当前数等于划分值,跳下一个
2)当前数小于划分值,和小于区换,小于区扩,跳下一个
3)当前数大于划分值,和大于区换,大于区扩,当前值不变
当前数遇到大于区位置,停止
public static void partition(int[] arr, int start ,int end, int value) {
int lessIndex = start - 1;
int largerIndex = end + 1;
while(start < largerIndex) {
if(arr[start] < value) {
swap(arr, ++lessIndex, start++);
}else if(arr[start] > value) {
swap(arr,--largerIndex,start);
}else {
start++;
}
}
}
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
网友评论