javascript简单算法

分享请标明来自:https://www.css3.io/javascript-algorithm.html

折半查找算法


var data = [3, 12];
var goal = 3;

function bSearch(goal, array, indexStart, indexEnd) {

    if (indexStart > indexEnd) {
        return -1;
    }

    // 这里是关键, 不能(indexEnd+indexStart)/2 有溢出风险
    var mid = indexStart + Math.floor((indexEnd - indexStart)/2, 10);

    if (array[mid] === goal) {
        return mid;
    }

     if (goal > array[mid]) {

         // indexStart = mid+1 很重要, 
         // 不能是indexStart = mid,
         // 用于开头 indexStart > indexEnd 跳出判断。
         indexStart = mid + 1; 
     }
     else if (array[mid] > goal) {

         // mid-1 同上
         indexEnd = mid - 1; 
     }

     return bSearch(goal, array, indexStart, indexEnd);
}

console.log(bSearch(goal, data, 0, data.length - 1));

快速排序


Array.prototype.quickSort = function () {
    var arr = this || [];
    if (arr.length <= 1) {
        return arr;
    }
    var goalIndex = Math.floor(arr.length / 2);
    var goal = arr[goalIndex];
    var leftArr = [];
    var rightArr = [];

    arr.forEach(function(val, index){
        if(goalIndex === index) {
            return;
        }
        if (val > goal) {
            rightArr.push(val);
        } 
        else {
            leftArr.push(val);
        }
    });

    return leftArr.quickSort().concat(goal, rightArr.quickSort());
}

var arr = [5, 2, 3, 4, 5];
console.log(arr.quickSort());

按多健值排序


var by = function () {
    var args = arguments || [];

    return function (a, b) {
        var key = '';
        for (var i = 0; i < args.length; i ++) {
            key = args[i];

            if(a[key] === b[key]) {

                //最后一个key如果还等,着视为相等
                if (i === args.length - 1) {
                    return 0;
                }
                continue;
            }

            return a[key] < b[key] ? -1 : 1;
        }
    }
}
var obj = [
    {id: 3, name: 'b'},
    {id: 1, name: 'a'},
    {id: 2, name: 'b'},
    {id: 1, name: 'c'}
]

// 先按name排序,name相等再按id排序
console.log(obj.sort(by('name', 'id')));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值