【分治法】求数组最大值和最小值(js版)

分治法:即分而治之,把一个复杂的问题分成两个或更多相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解为子问题解的合并。

本文讲解用JavaScript实现分治法。

①简单方法,通俗易懂

//定义数组
var arr = [120, 34, 56, 17, 234, 12];
/* arr:数组
*  start:数组起始下标
*  end:数组结束下标
**/
//获取数组最大值
function getMax(arr, start, end){
    if(start == end){
        return arr[start];
    }else{
        var mid = parseInt( (start + end)/2 );
        var prev = getMax(arr, start, mid);
        var next = getMax(arr, mid + 1, end);

        return prev > next ? prev : next;
    } 
}
//获取数组最小值
function getMin(arr, start, end){
    if(start == end){
        return arr[start];
    }else{
        var mid = parseInt( (start + end)/2 );
        var prev = getMin(arr, start, mid);
        var next = getMin(arr, mid + 1, end);

        return prev > next ? next : prev;
    } 
}
console.log("max=" + getMax(arr, 0, 5));
console.log("min=" + getMin(arr, 0, 5));

②归并为一个函数

//定义数组
var arr = [120, 34, 56, 17, 234, 12];
/* arr:数组
*  start:数组起始下标
*  end:数组结束下标
*  method:获取最大值还是最小值,1表示最大值,0表示最小值
**/
//获取数组最大值
function getMaxOrMin(arr, start, end, method){
    if(start == end){
        return arr[start];
    }else{
        var mid = parseInt( (start + end)/2 );
        var prev = arguments.callee(arr, start, mid, method);
        var next = arguments.callee(arr, mid + 1, end, method);

        if(method){
            return prev > next ? prev : next;
        }else{
            return prev > next ? next : prev;
        }
    } 
}
console.log("max=" + getMaxOrMin(arr, 0, 5, 1));
console.log("min=" + getMaxOrMin(arr, 0, 5, 0));

这个方法的比之第一个方法,代码更紧凑,值得说明的是,arguments.callee()方法,该方法的作用是指向当前函数,所以我们用该方法实现了递归调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值