2.1.2 快速排序

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;
    }

推荐阅读更多精彩内容