zoukankan      html  css  js  c++  java
  • 快速排序法精简理解

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

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

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

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

    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,不多说话。

  • 相关阅读:
    day39-Spring 06-Spring的AOP:带有切点的切面
    第五讲:单例模式
    day39-Spring 05-Spring的AOP:不带有切点的切面
    day39-Spring 04-CGLIB的动态代理
    day39-Spring 03-JDK的动态代理
    day39-Spring 02-AOP的概述
    第三十二讲:UML类图(下)
    ASP.NET资源大全
    ASP.NET资源大全
    ASP.NET资源大全
  • 原文地址:https://www.cnblogs.com/bpjj/p/11246709.html
Copyright © 2011-2022 走看看