• 排序算法——快速排序


    排序思路

    ① 若数组长度为0/1,直接返回结果,否则从数组中间取一个数字作为基准值
    ② 将数组从左到右分成三份 第一份中的数字小于基准值,第二份是基准值,第三份中数字大于基准值
    ③ 对第一份和第三份中的数字递归重复步骤①②,返回三份数组拼接起来的结果
     
    以对数组[8,6,5,9,4,3]排序为例,画了个简图:

    javascript实现

    /**
     * 思路:在数组中间取一个数字作为基准值,大于基准值的数字放到右边子数组,
     * 小于基准值的数字放到左边子数组,拼接起来即得到最终结果
     * @param arr
     */
    function quickSort(arr){
        //判断参数是否合法
        if(!(arr instanceof  Array)) return [];
        if(arr.length<=1) return arr;
        //定义基准值、左边数组、右边数组,并从原数组中去除基准值
        var jizhun=arr.splice(Math.floor(arr.length/2),1),
            left=[],
            right=[];
        //遍历去除基准值后的原数组
        arr.forEach(function(n){
            n<jizhun?left.push(n):right.push(n);
        });
        //对左右数组分别快速排序,并返回结果
        return quickSort(left).concat(jizhun,quickSort(right));
    }

    例如输入数组[5,4,1,3,2] 

    分解动作如下:

    step1   基准值为1  ,分解结果 [],[1],[5,4,3,2]

    step2   右侧数组,基准值为3,分解结果  [2],[3],[5,4]

    step3   右侧数组,基准值为5 ,分解结果 [4],[5],[]

    step4   假设三部分数组的名字分别为  left  jz  right ,则

    result=left1+jz1+right1

    right1= left2+jz2+right2

    right2=left3+jz3+right3

    所以result=left1+jz1+left2+jz2+left3+jz3+right3

    结果是  [1,2,3,4,5]

  • 相关阅读:
    register变量
    register变量
    const和volatile是否可以同时修饰一个变量?有什么特殊含义?
    关于多态性和虚函数的理解
    static全局变量与普通的全局变量有什么区别
    《c专家编程》学习笔记
    正则表达式入门学习
    mvc ActionResult
    ASP.NET MVC:通过 FileResult 向 浏览器 发送文件(传)
    Asp.net mvc 中的HttpContext
  • 原文地址:https://www.cnblogs.com/tzyy/p/4866956.html
Copyright © 2020-2023  润新知