目录

快速排序

基本介绍

快速排序(Quick Sort)使用分治法策略。它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。然后,再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

排序流程

  1. 从数列中挑出一个基准值。
  2. 将所有比基准值小的摆放在基准前面,所有比基准值大的摆在基准的后面(相同的数可以到任一边);在这个分区退出之后,该基准就处于数列的中间位置。
  3. 递归地把"基准值前面的子数列"和"基准值后面的子数列"进行排序。

快速排序一般有两种方法:第一种是挖坑法,第二种是前后指针法,第一种较常用。

代码实现(挖坑法)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
	public static void quickSort(int[] arr) {
        quickSort(arr, 0, arr.length - 1);
    }

    /**
     * 快速排序 挖坑填数法
     *
     * @param arr
     */
    public static void quickSort(int[] arr, int left, int right) {

        if (left >= right) {
            return;
        }
        int x = arr[left], i = left, j = right;
        while (i < j) {
            //从右到左找第一个比x小的数 填坑
            while (arr[j] >= x && i < j) {
                j--;
            }
            if (i < j) {
                arr[i] = arr[j]; //将arr[j]填到arr[i]中,arr[j]就形成了一个新的坑
                i++;
            }
            //从左到右找到第一个数比x大的数填最近出现的坑
            while (arr[i] <= x && i < j) {
                i++;
            }
            if (i < j) {
                arr[j] = arr[i]; //将arr[i]填到arr[j]中,arr[i]就形成了一个新的坑
                j--;
            }
        }

        arr[i] = x;
        quickSort(arr, left, i - 1); //递归调用
        quickSort(arr, i + 1, right);
    }