算法入门五——快速排序算法(中)

Posted 夕水

tags:

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

前面一节中之所以会提到分而治之思想,是因为接下来的快速排序算法需要按照这种思想去理解.快速排序算法比选择排序算法(也被叫做冒泡排序算法)快的多.我们需要知道,什么样的数组需要进行排序,什么样的数组不需要进行排序.很显然当数组没有元素或者只有一个元素时,我们无需对数组进行排序.


空数组:[]

只有一个元素的数组:[2];


像如上的数组,我们没必要排序,因此接下来的函数中,我们可以如此写:


function quickSort(arr){

    if(arr.length < 2){

        return arr;

    }

}


当数组的元素超过两个呢,比如[12,11].我们可能都会这样想,检查第一个元素是否比第二个元素大,然后确定是否交换位置.而如果是三个元素呢,甚至更多元素呢?我们是否还能这样做呢?


我们可以采用分而治之的思想,即D&C策略.将数组分解.直到满足基线条件.这也就是说,我们会采用递归原理来实现.快速排序算法的工作原理就是从数组当中选择一个元素,这个元素也被叫做基准值.


然后我们就可以根据这个基准值找出比基准值大或者比基准值小的元素,这样被称作分区.进行分区之后,你将会得到:


一个比基准值小而组成的子数组.

一个包含基准值的数组.

一个比基准值大而组成的子数组.


当然这里得到的所有子数组都是无序的,因为如果得到的是有序的,那么排序将会比较容易.直接将分解后的数组利用concat()方法给合并,就能得出排序结果呢.


基准值的选择是不确定的,这也就意味着你可以选择最中间的数,也可以选择第一个数,甚至是最后一个数都可以.比如一个数组[5,2,3,1,4];

数组当中的五个元素你都可以当作基准值,而每一个基准值所分区出来的子数组也会有所不同.


我们通过以上的多种类推和归纳就能得出最终的结果.而这种证明算法行之有效的方式就叫做归纳证明.归纳证明结合快速排序算法,可以让我们的算法变得生动有趣.


现在,我们来实现快速排序的算法吧,代码如下:


function quickSort(arr){

    //定义一个空数组接收排序后的数组

    var newArr = [];

    //当数组的长度小于2时,不需要进行排序

    if(arr.length < 2){

        return arr;

    }else{

        //定义一个基准值,这里就取中间值吧

        var standIndex = Math.floor(arr.length / 2);//由于可能数组长度不是偶数,所以,需要取整

        //使用基准值所对应的元素值,由于要最后合并三个数组所以这里采用splice()方法取得基准值所组成的数组

        var standNum = arr.splice(standIndex,1);

        //接下来,我们需要定义两个空数组,用于保存以基准值作为分区的最小子数组和最大子数组

        var minArr = [],maxArr = [];

        //循环数组将每一个元素与基准值进行比较,小则添加到最小子数组中,大则添加到最大子数组中

        for(var i = 0,len = arr.length;i < len;i++){

                if(arr[i] < standNum){

                    minArr.push(arr[i]);

                }else{

                    maxArr.push(arr[i]);

                }

        }

        //循环完成之后合并三个子数组,当然这里需要递归合并,直到数组长度小于2为止

        newArr = quickSort(minArr).concat(standNum,quickSort(maxArr));

    }

    //返回合并后的新数组

    return newArr;

}

//测试

quickSort([1,3,2,4,5]);//[1,2,3,4,5]

以上是关于算法入门五——快速排序算法(中)的主要内容,如果未能解决你的问题,请参考以下文章

排序算法入门之快速排序(java实现)

C语言编程入门笔记基础学习排序算法之快速排序,轻松掌握快排!

算法入门||第五节 快速排序

快速排序从入门到精通

《算法零基础100例》(第40例) 进阶排序 - 快速排序

Python|冒泡算法快速入门