快速排序


一.概念

      快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

二.排序分析

      快速排序的基本思想:

            1、先从数列中取出一个数作为基准数。

            2、从两端开始“探测”。先从右往左找一个小于基准数的数,再从左往右找一个大于基准数的数,然后交换他们,然后继续探测。

            3、当左右下标重合的时候,交换基准数和当前下标数,比如当前左右下标相等的数为k,则相当于把数列进行分区,左分区为[0,k-1],右分区为[k+1,n]。

            4、重复上面的过程,完成排序。

        待排序数组 :  

       第一步:以最右边的6为基准点

      

       第二步:从左边开始找比6大的数,很显然是8

    

       第三步:从右边开始找比6小的数,很明显是4

    

       第四步:交换8和4的位子

     

 

       第五步:继续开始从左边找比6大的数,找到9

    

       第六步:从右边开始找比6小的数,当左右下标重合时

     

       第七步:交换重合位子数值和基准数的位子

    

       第八步:两个分区重复上面的过程,直到结束

    

三.时间复杂度和空间复杂度

        快速排序的平均时间复杂度也是:O(nlogn),空间复杂度O(logn)。

四.快速排序动图

五.Java代码实现

/**
 * 快速排序
 */
public class QuickSort {
    public static void main(String[] args) {
        int[] arrays = {4,7,6,5,3,2,8,1,9};
        int length = arrays.length;
        new QuickSort().quickSort(arrays,0,length-1);
        for (int array : arrays) {
            System.out.println(array);
        }
    }

    public void quickSort(int[] array, int start, int end) {
        if(start >= end){
            return;
        }
        int index = getIndex(array, start, end);
         quickSort(array, start, index-1);
        quickSort(array, index + 1, end);
    }

    private int getIndex(int[] array, int start, int end) {
        int temp;
        int pivot = start;
        int i = start;
        int j = end;
        while (i != j) {
            if (array[j] > array[pivot]) {
               j--;
            } else {
                if (array[i] <= array[pivot]) {
                   i++;
                } else {
                    temp = array[i];
                    array[i] = array[j];
                    array[j] = temp;
                    j--;
                }
            }
        }
        temp = array[i];
        array[i] = array[pivot];
        array[pivot] = temp;
        return i;
    }
}

附录:算法动态图:https://www.cs.usfca.edu/~galles/visualization/