快速排序

package sort;

/**
 * 快速排序
 *
 * https://www.bilibili.com/video/av39519566?from=search&seid=14779126765886964608
 */
public class QuickSort {
    public static void main(String arg[]) {
        int[] arr = {3, 5, 6, 3, 7, 9, 7, 4, 8, 0, 5};
        quickSort(arr, 0, arr.length-1);
        for (int e : arr) {
            System.out.println("e = " + e);
        }
    }

    private static void quickSort(int[] arr, int left, int right) {
        //左索引必须比右索引小
        if (left > right) {
            return;
        }
        //第一个数为基准数
        int bash = arr[left];
        //定义变量i,指向最左边
        int i = left;
        //定义变量j,指向最右边
        int j = right;

        //当i和j不相遇时,在循环中进行检索
        while (i != j) {
            //右边寻找比基准数小的数
            while (arr[j] >= bash && i < j) {
                j--; //j从右往左移动
            }

            //左边寻找比基准数大的数
            while (arr[i] <= bash && i < j) {
                i++;
            }

            //交换
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }

        //此时i和j相遇
        //当i和j相遇时,交换基准数和相遇位置的元素
        arr[left] = arr[i];//相遇位置赋值给基准数
        arr[i] = bash;//基准数的值赋值给相遇位置
        /*
          此处习惯性写成base和arr[i]交换,错误原因是base这里只是临时变量,替换无意义
        所以是base之前的赋值项arr[left]来和arr[i]实现数组的交换
        */

        //基准数已经归位,左边比基准数小,右边大
        //继续排基准数左边和右边
        quickSort(arr, left, i - 1);
        quickSort(arr, i + 1, right);
    }
}

原文地址:https://www.cnblogs.com/xiongyungang/p/10468005.html