快速排序法精简理解

今天工作的空余时间比较多,说点废话。

话说三国时期,孙权送来了一头巨象给曹操,曹操想知道这象的重量,询问属下,都不能说出称象的办法。曹冲说:“把象放到大船上,在水面所达到的地方做上记号,再让船装载其他东西(当水面也达到记号的时候),称一下这些东西,那么比较下(东西的总质量差不多等于大象的质量)就能知道了。”

将一个问题分割称一些小问题,然后递归解决,再利用这些小问题的解合并成原来的的大问题的解,此乃分而治之法。

我理解的快速排序,就是一种分而治之方法。

1.从数列中选出一个元素作为基数(pivot)(一般取第一个或最后一个)。

2.所有的数据都将围绕这个基数进行,将小于改基数的元素放在它的左边,大于或等于它的数全部放在它的右边

3.对左右两个小数列重复上述步骤,直至各区间只有1个数。

如图:

上代码

        var arr = [11,2,3,5,7,1,4,6,15,5,2,7,9,10,15,9,17,12];
            function fastSort(arr){
                if(arr.length == 0){
                    return [];
                }
                var left = [];                            //左侧部分的数
                var right = [];                            //右侧部分的数
                var pivot = arr[0];                        //基数
                for(var i = 1; i < arr.length;i++){
                    if(arr[i] < pivot){                    //小的放到左边
                        left.push(arr[i]);
                    }else{                                //大的放到右边
                        right.push(arr[i])
                    }
                }
                //递归完了,数组一拼接 ,完事儿,谢谢
                return fastSort(left).concat(pivot,fastSort(right));
            }
            //打印下
            console.log(fastSort(arr));

对于空间复杂度,啥时候最佳啥时候最差,不做过多解释,力求精简,反正我一看文字多的博客就耐不下心,估计你们也一样,SO,不多说话。

 

posted @ 2019-07-25 20:19  半瓶假酒  阅读(270)  评论(0编辑  收藏  举报