快速排序(QuickSort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将需要排序的数据分成独立两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按照此方法对这两组数据分别进行快速排序,这个排序过程可以递归进行,以此达到整个数据变成有序序列。

# 一、基本介绍

快速排序是实践中的一种快速的排序算法,在对 Java基本类型的排序中特别有用。它的平均运行时间是O(NlogN)。该算法之所以特别快,主要是由于非常精练和高度优先的内部循环(递归)。它的最坏情形性能为O(N^2),但进行简单修改就可以使该情形极难出现。下面描述最常见的快速排序的实现 “经典快速排序”。原理视频:链接

# 二、快速排序代码演示

首先理解快速排序的思想,继而根据思想编写代码即可。

/**
 * 快速排序:思想:先将最后一个元素获取出来,作为枢纽元(pivot),开始移动左右指针
 */
public class QuickSort {

    public static void main(String[] args) {
        Integer[] a = {44,33,66,2,4,88,44,62,49,23,43,89,50};
        //Integer[] a = {44,44,44,44,44,44,44,44,44,44,44,44,50};
        new QuickSort().sort(a,0,a.length-1);
        List<Integer> ints = Arrays.asList(a);
        for(int i: ints){
            System.out.printf(i + "   ");
        }
    }

    //传入目标数组,左索引和右索引
    public void sort(Integer[] arr , int left, int right){
        int l = left;
        int r = right-1;

        //当 left < right 的情况下进行无限循环
        while(left < right && l >= 0 && r >= 0 && l < right && r < right){

            //循环获取 l > 最后一个元素的数据
            while(arr[l] < arr[right]){
               l++;
            }

            //循环获取 R < 最后一个元素的数据,这里添加等于是防止大量相同的元素的时候,r和l指针都不移动则会出现问题;
            while(arr[r] >= arr[right] && r > 0){
                r--;
            }

            //如果l 与 r 指针符合逻辑则交换彼此的数据
            if(l < r){
                //交换数据
                swap(arr , l, r);
             //如果两个相等,或者l > r 那么就说明比较结束,交换 l 与枢纽元 pivot
            }else{
                swap(arr , l, right);
                //递归调用:对最左边的进行排序,l是当前的中间值
                //注意这里不要使用 --l 因为 --l 会改变l的值,举个例子,L=6时,--L后l=5 L-1 后 L=6 ,我们后面的 l+1需要初始的L值所以,不要使用 L--
                sort(arr , left, l-1);
                //递归调用:对最右边的进行排序,l是当前的中间值
                sort(arr , l+1,right);
                break;
            }
        }
    }
    //交换方法
    public void swap(Integer[] arr ,int i,int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
(adsbygoogle = window.adsbygoogle || []).push({});