小白懂算法之快速排序

Posted ibcdwx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小白懂算法之快速排序相关的知识,希望对你有一定的参考价值。

一.快速排序介绍

  快速排序(Quick Sort)概念:是由冒泡排序改进而得到的。在冒泡排序过程中,只对相邻的两个记录进行比较,因此每次交换两个相邻记录时只能消除一个逆序。如果能通过两个(不相邻)记录的一次交换,消除多个逆序,则会大大加快排序的速度。快速排序方法中的一次交换可以消除多个逆序。

二.算法原理

  快速排序的算法原理:在待排序的n个记录中任取一个记录(通常取第一个记录)作为基准数(与其他记录比较的数),设其关键字为pivotkey。经过一趟排序后,把所有关键字小于pivotkey的记录交换到前面,把所有关键字大于pivotkey的记录交换到后面,结果将待排序记录分成两个子表,最后将基准数放置在分界处的位置。然后,分别对左右子表重复上述过程,直至每个子表只有一个记录时排序完成。

三.实现代码(Java实现)

    public static void FastSort(int[] arr,int i,int j) {
        /**
         *     实现思路:
         *         在数组随便选择一个作为基准数,默认是数组第一个
         *         需要两个伪指针指向在数组两边的元素并向内逐一与基准数比较
         *         左边指针 为 left 专门查找比基准数大的数,右边指针 right 专门查找比基准数小的数
         *         若left>right则逻辑不成立
         *         在满足left<right的情况下,left和right且找到了满足值,则进行交换
         *         当left和right重合或者left>right时就不再查找了,将基准数归位,即放到一个分界点位置,左边数小于基准数,右边大于基准数
         *         递归调用本函数,重新设定指针left,right的所指的位置
         * 
         *         下面注释所说的指针只是方便解释!
         */
        if(i>j) return;
        
        int left = i;    //left为左指针
        int right = j;    //right为右指针
        int temp = arr[i];    //临时保存基准数
        
        while(left < right) {    //满足left < right,即可开始下一轮的查找

            while(arr[right] >= temp && left < right) {    //当右指针所指的数比基准数大且left < right,查找下一个
                right--;
            }
            
            while(arr[left] <= temp && left < right) {    //当左指针所指的数比基准数小时且left < right,查找下一个
                left++;
            }
            
            if(left < right) {    //当左边位置<右边位置时,就交换数值
                int t = arr[left];
                arr[left] = arr[right];
                arr[right] = t;
            }
            
        }
        
        //将基准数归位到分界点,这里的分界点位置以left或者right都行。
        arr[i] = arr[left];
        arr[left] = temp;
        
        FastSort(arr,i,left-1);    //基准数两边递归调用
        FastSort(arr,left+1,j);
        
    }

  强调:

    1.在上面代码的情况,实际上不可能会出现left > right的情况,都是在left = right的时候,不满足left<right而while就终止掉了;你看上面的代码都加了left<right的判断,你不信自己尝试下。

    2.记住如果基准数在数组的左边,那么必须从right先开始,因为从right先开始就能保证right右测的数一定是大于基准数的,到时候left和right处在同一个位置时,此位置的右边一定是比基准数大的;具体原因还是因为受left<right这个条件的限制,可以自己debug看下整个过程。

  main方法测试:

    public static void main(String[] args) {
        //创建一个无序数组
        int[] arr = new int[] {2,3,1,4,5,7,6,8,10,9};
        //调用快速排序方法,返回一个排序后的方法
        FastSort(arr,0,arr.length-1);
        
        //遍历数组
        System.out.print("最终结果:");
        for(int i=0;i<arr.length;i++) {
            System.out.print(arr[i]+" ");
        }
        
    }

  OK,如果有任何疑问可在下面留言!

以上是关于小白懂算法之快速排序的主要内容,如果未能解决你的问题,请参考以下文章

快速排序,找中位

算法排序之堆排序

一文读懂快速排序

技术回忆录02|搞懂快速排序

你真的懂快速排序吗?

一文带你读懂排序算法:希尔排序算法