zoukankan      html  css  js  c++  java
  • 排序算法——快速排序

    排序思路

    ① 若数组长度为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]

  • 相关阅读:
    还记得那种 喜欢到不行的感觉么?
    从点到面,再从面到点
    草珊瑚的常见移动网站布局
    草珊瑚的CSS基础
    表驱动编程
    如果一切需要重学,2014年应该学哪些技术?
    揭开Makefile的神秘面纱
    VIM资源
    VIM跳转技巧
    前女友究竟是一种怎样的存在?
  • 原文地址:https://www.cnblogs.com/tzyy/p/4866956.html
Copyright © 2011-2022 走看看