经典排序之二 快速排序 + 二路归并

快速排序,顾名思义效率相比较其他排序方法高,它是一种交换排序

基本思路是

1:将待排序数组的中间见作为一个参考值

2:大于参考值的 放右边的数组,小于参考值的放左边的数组

3:对左右两个数组做1,2操作,直至数组里只有一个数值

 

 function quickSort(arr){
        if(arr.length <=1 ){
            return arr;
        }
        //splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。  会改变原数组
        //Math.floor() 方法对一个数进行往下取整 小于等于x,且与x最接近的整数
        var temp = arr.splice(Math.floor(arr.length/2),1)[0];
        var arrLeft = [];
        var arrRight = [];

        for(var i=0;i<arr.length;i++){
            if(arr[i]>=temp){
                arrRight.push(arr[i]);
            } else {
                arrLeft.push(arr[i]);
            }
        }
        console.log("左边的数组:"+ arrLeft+ "参考值" + temp + "右边的数组:"+ arrRight + "总数组"+ arr)
        return quickSort(arrLeft).concat(temp,quickSort(arrRight));
	//return arguments.callee(arrLeft).concat(temp,arguments.callee(arrRight)); 不推荐使用arguments.callee
    }
    var arr1 = [9,2,1,2,8,546,23,0];
    quickSort(arr1);
    左边的数组:2,1,2,0   参考值8    右边的数组:9,546,23 总数组9,2,1,2,546,23,0
    左边的数组:1,0       参考值2    右边的数组:2        总数组2,1,0
    左边的数组:          参考值0    右边的数组:1        总数组1
    左边的数组:9,23      参考值546  右边的数组:         总数组9,23
    左边的数组:9         参考值23   右边的数组:         总数组9
    [0, 1, 2, 2, 8, 9, 23, 546]
二路归并 

//新的知识点  While 循环会在指定条件为真时循环执行代码块。 只要指定条件为 true,循环就可以一直执行代码。
function merge(left,right){
        var result = [],
                il= 0,
                ir=0;

        while(left.length>il && right.length>ir){
            if(left[il]<right[ir]){//挨个比较
                result.push(left[il++])
            } else {
                result.push(right[ir++])
            }
            console.log(result);
        }

        while(left[il]){//当两个数组的长短不一致,比较完成以后剩余的数字再添加上去
            result.push(left[il++])
        }

        while(right[ir]){
            result.push(left[ir++])
        }
    }
    var arr1 = [2,3,4,78,90,100];
    var arr2 = [1,58,77,79,91];
    merge(arr1,arr2)

    [1]
    [1, 2]
    [1, 2, 3]
    [1, 2, 3, 4]
    [1, 2, 3, 4, 58]
    [1, 2, 3, 4, 58, 77]
    [1, 2, 3, 4, 58, 77, 78]
    [1, 2, 3, 4, 58, 77, 78, 79]
    [1, 2, 3, 4, 58, 77, 78, 79, 90]
    [1, 2, 3, 4, 58, 77, 78, 79, 90, 91]





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值