教你一分钟理解快速排序

什么是快速排序?

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

算法原理

单单看以上解释还是有些模糊,可以通过实例来理解它,下面通过一组数据来进行排序过程的解析:

原数组:{3,7,2,9,1,4,6,8,10,5}

期望结果:{1,2,3,4,5,6,7,8,9,10}

快速排序示意图:
教你一分钟理解快速排序_第1张图片
00.png

Demo步骤解析:

1.一开始选定数组的最后一个元素5作为基准值,也就是最终排序结果应该是以5为界限划分为左右两边。

2.从左边开始,寻找比5大的值,然后与5进行调换(因为如果比5小的值本来就应该排在5前面,比5大的值调换之后就去到了5的后面),一路过来找到了7,将7与5调换,结束此次遍历。

3.从右边开始,由于7已经是上一轮排好序的便不再动它,从10开始,一路向左遍历,寻找比5小的值,然后与5进行调换(因为如果比5大的值本来就应该排在5后面,比5小的值调换之后就去到了5的后前面),一路过来找到了4,将4与5调换,结束此次遍历。

4.从左边开始,由于3和4都是前两轮已经排好序的便不再动它,从2开始,一路向右遍历,寻找比5大的值,然后与5进行调换(道理同步骤2),一路过来找到了9,将9与5调换,结束此次遍历。

5.从右边开始,由于排在9后面的那几个数字都是上几轮排好序的便不再动它,从1开始,一路向右遍历,寻找比5小的值,然后与5进行调换(道理同步骤3),一下子就找到了1,将1与5调换,结束此次遍历。

6.这个时候,发现5的左右两边都是排好序了的,所以结束此轮排序,5的左右两边抽出来各自进行下一轮的排序,规则同上,直到无法再拆分下去,即完成了整体的快速排序。

代码

public class Test3 {

    public static void main(String[] args){
        int[] arr = new int[]{3,7,2,9,1,4,6,8,10,5};
        sort(arr,0,arr.length-1);
        printArray(arr);
    }

    public static void printArray(int arr[]){
        for(int n:arr){
            System.out.print(n+",");
        }
    }

    static void sort(int arr[], int start, int end){
        if(start>end){
            return;
        }else{
            int partition = divide(arr,start,end);
            sort(arr,start,partition-1);
            sort(arr,partition+1,end);
        }

    }

    /**
     *  将数组的某一段元素进行划分,小的在左边,大的在右边
     * */
    static int divide(int[] arr, int start, int end){
        //每次都以最右边的元素作为基准值
        int base = arr[end];
        //start一旦等于end,就说明左右两个指针合并到了同一位置,可以结束此轮循环。
        while(start < end){
            while(start < end && arr[start] <= base)
                //从左边开始遍历,如果比基准值小,就继续向右走
                start++;
            //上面的while循环结束时,就说明当前的a[start]的值比基准值大,应与基准值进行交换
            if(start= base)
                //从右边开始遍历,如果比基准值大,就继续向左走
                end--;
            //上面的while循环结束时,就说明当前的a[end]的值比基准值小,应与基准值进行交换
            if(start

你可能感兴趣的:(教你一分钟理解快速排序)