排序算法——快速排序

排序思路

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

posted @ 2015-10-10 15:10  桃子夭夭  阅读(227)  评论(0编辑  收藏  举报