0. 索引

1. 简单介绍

关于原理,虽然很重要,但是在这里不做过多介绍。 因为随便搜索一下。就可以找到更好的答案。

本质是回顾,记住核心的思想,然后通过code 深刻 已有概念的印象。

2. 双边循环法


/**
 * 快速排序的基本方法
 *
 * @param intArr     待排序的数组
 * @param startIndex 开始的 index
 * @param endIndex   结束的 index
 * @return 循环次数
 */
public static long sort(int[] intArr, int startIndex, int endIndex) {
    if (startIndex >= endIndex) {
        return 0;
    }
    // 找到基准位置。 位置左边的的都是小于的,位置右边的都是大于的。 + 同事做好了排序
    int pivotIndex = doubleSideSortFindPivot(intArr, startIndex, endIndex);

    sort(intArr, startIndex, pivotIndex - 1);
    sort(intArr, pivotIndex + 1, endIndex);

    return 1;
}

/**
 * 分治(双边循环法)
 *
 * @param intArr     待交换的数组
 * @param startIndex 起始下标
 * @param endIndex   结束下标
 */
public static int doubleSideSortFindPivot(int[] intArr, int startIndex, int endIndex) {
    int pivotVal   = intArr[startIndex];
    int leftIndex  = startIndex;
    int rightIndex = endIndex;

    // MARK : 之前用if leftIndex < rightIndex 报错
    while (leftIndex != rightIndex) {

        // 之前自己的写法比较混乱
        // step 1 :控制 right 指针,左移
        // 错误1 : 使用了 if ,毕竟可以一直左移。 逻辑判断 MARK
        while (leftIndex < rightIndex && intArr[rightIndex] > pivotVal) {
            rightIndex--;
        }
        // step 2 : 控制 left 指针 右移
        while (leftIndex < rightIndex && intArr[leftIndex] <= pivotVal) {
            leftIndex++;
        }

        // step 3 :交换 left 和 right。 需要加限制条件
        if (leftIndex < rightIndex) {
            int temp = intArr[leftIndex];
            intArr[leftIndex] = intArr[rightIndex];
            intArr[rightIndex] = temp;
        }
    }

    // 【replace】pivot和指针重合点交换
    intArr[startIndex] = intArr[leftIndex];
    intArr[leftIndex] = pivotVal;

    return leftIndex;
}

3. 单边循环法

/**
 * 分治(单循环法) 把 小于基准值的,交换(和基准值的index )到 pivot 的左边
 *
 * @param intArr     待交换的数组
 * @param startIndex 起始下标
 * @param endIndex   结束下标
 */
public static int oneSideSort(int[] intArr, int startIndex, int endIndex) {
    // 默认起始位置为基准值
    int pivotVal = intArr[startIndex];
    // 基准值的位置,不断移动。左边的代表交换过来的小于 pivotVal 的
    int mark = startIndex;

    // 如果小于基准值的,交换,mark 右移
    for (int i = startIndex + 1; i <= endIndex; i++) {
        // 小于的做交换
        if (intArr[i] < pivotVal) {
            mark++; // 基准位右移
            int temp = intArr[mark];
            intArr[mark] = intArr[i];
            intArr[i] = temp;
        }
    }

    // 交换
    intArr[startIndex] = intArr[mark];
    intArr[mark] = pivotVal;

    return mark;
}

天真真不知路漫漫
70 声望6 粉丝

1