Loading

快速排序

核心思想:

1、选取一个左边第一个元素为基数,从两头遍历集合( left、right 分别从两端索引)

2、判断 left 索引的值 大于 基数的 值,right 索引小于 基数的值 (right 先索引,然后 left 索引,当遇到符合的条件时停止索引)

3、交换两个索引的数值,然后继续遍历

4、当 left 与 right 相遇时 结束当前索引(即 left = right)

5、将基数所在位置与 left(或right) 所索引位置的值进行交换

6、递归调用当前基数索引(idx)两端的集合:left …… idx-1 idx idx + 1 …… right

快速排序的时间复杂度为O(NlogN)

package com.jason.sort;

/**
 * @program: LeetCode
 * @description: 快速排序
 * @author: CodeDuck
 * @create: 2020-07-17 20:23
 **/
public class QuickSort {

    public static void main(String[] args) {
        int[] arr = {6, 7, 18, 3, 5, 4, 10, 9};
        quickSort(arr);
        for (int a : arr) {
            System.out.println(a);
        }
    }

    public static void quickSort(int[] arr) {
        quickSort(arr, 0, arr.length - 1);
    }

    /**
     * @Description: 快速排序
     * @Param: int[] 数组
     */
    private static void quickSort(int[] arr, int left, int right) {

        if (left >= right) {    // 当满足条件时结束当前递归
            return;
        }

        int i = left;   // 左索引
        int j = right;  // 右索引

        // 从数组的最左端开始,选取基准数
        int baseNum = arr[left];

        // 关于为什么是 右边的 j 先走问题
        // 此排序为升序排序,如果 i 先走,走到最后与 j 相遇是主动跑到 j 位置上,而 j 索引的值默认是大于基数的
        // 此时的数是大于基数的,不能将此数同基数交换
        while (i < j) {
            while (arr[j] >= baseNum && i < j) {    // 从右至左选择小于基数的数
                j--;
            }
            while (arr[i] <= baseNum && i < j) {    // 从左至右选择大于基数的数
                i++;
            }

            if (i < j) {
                swap(arr, i, j);                    // 交换两个数值
            }
        }

        arr[left] = arr[i];                         // 将当前 i 与 j 相遇的值与基数交换
        arr[i] = baseNum;

        quickSort(arr, left, i - 1);            // 递归调用基数左边的集合
        quickSort(arr, i + 1, right);            // 递归调用基数右边的集合

    }

    /**
     * @Description: 交换元素
     * @Param: arr 元素组
     * @Param: i,j数组下标
     * @return: void
     */
    private static void swap(int[] arr, int i, int j) {

        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}
posted @ 2020-07-17 21:14  codeduck  阅读(115)  评论(0编辑  收藏  举报