快速排序:

选取第一个元素作为基准点(可以随机选取),将剩下元素与基准点进行比较,

比基准点大的放在右边,比基准点小的放在左边, 得到左子表和右子表,递归调用本函数;

代码:

/**

  • @title: quickSort
    • @description: 快速排序: 选取第一个元素作为基准点(可以随机选取),将剩下元素与基准点进行比较,
    • 比基准点大的放在右边,比基准点小的放在左边, 得到左子表和右子表,递归调用本函数;
    • @date: Jun 10, 2019 8:19:59 PM
    • @param value
    • @param begin 开始下标
    • @param end 结束下标
    • @throws:
    • */
public static void quickSort(int[] value, int begin, int end) {
        if (begin >= 0 && begin < end && end < value.length) {
            int i = begin, j = end;
            int center = value[i];// 中心元素

            while (i != j) {
                while (i < j && center < value[j]) {
                    j--;
                }
                if (i < j)// 跳出循环也有可能时因为i=j,所以这里要判断一下
                    value[i++] = value[j];

                while (i < j && center > value[i]) {
                    i++;
                }
                if (i < j)
                    value[j--] = value[i];
            }
            value[i] = center;// 中心元素到达最终位置

            quickSort(value, begin, i - 1);
            quickSort(value, i + 1, end);
        }
    }

注解:

  • 简化步骤:当需要移动时,不用交换swap两个元素。

记录下刚开始比较的i下标元素(也就是基准点),需要移动的元素直接覆盖到移动到去向位置,在一轮比较结束后(i==j),i(或J)下标位置赋值 基准点,中心元素到达最终位置。

  • j向前逼近,当j下标元素比基准点小时,将j下标元素赋值到i位置,i下标++;

    i向后逼近,当i下标元素比基准点大时,将i下标元素赋值到j位置,j下标++;

    重复以上两步,直到i==j为止跳出循环,基准点赋值到i(或j)位置。

  • j向前逼近 和i向前逼近 两个循环不能倒过来,不然i位置一开始就和自己(基准点)比较大小了。

01-15 07:04