以下是心血成果,版权所有,未经允许,不得转载。作者:李金涛;FROM:光环国际 AT:201712172024.(方便以后,再次修改) <script> // 比较数组中数值的大小是比较常见的操作,比较大小的方法有多种,下面来介绍如下十四种方法,原理代码如下:
// 1,排序取值:sort比较器排序(常用),以及冒泡排序(不常用,但方法思想很重要);// 2,假设比较取大值:假设max=arr[0];index=0; 在循环往后比较,如果有比max大的数就让max记录下大的数,索引赋给index,循环做完,即得到满足条件的max与index;(if 判断大了赋新值,小了不管)// 3,冒泡排序思想,内外循环取大值:冒泡排序思想,内外循环,三目比较取大值,返回对比,匹配的可得对应索引;// 4,排除法:后两个比较,较小的扔出去,否则交换,while循环结束,剩下的一个就是最大值,最后返回对比,匹配的可得对应索引;// 5,比较排序法:遍历前后比,if前者大就交换,遍历完就是小大排序,接收最后一个。// 6,删除法:相互比,删除小的,剩下的就是最大的;/* 7, 使用 stream: 将一个数组放进 stream 里面,然后直接调用 stream 里的 min 或 max 函数得到最大值或最小值。 8, 使用 collection: 将数组转化为对象数组,即 int 转化为 Integer (需要使用 toObject 转换)。 然后调用 Collection 里面的 min或max. 9,采用的递归思路是:若求长度为L的数组最大值,即是求 数组前L-1个长度的最大值 和最后一个数组元素的相对较大值. 递归的精髓在于不断的调用自身,从后往前处理数据计算得出结果。求数组最大值也是从后往前比较,回溯求最值。 10, 利用二分查找法递归寻找数组中的最大值。 11,12,13,14,函数方法,详见最后代码; */ var arr1=[12,3,4,56,7,7]; function f1() {//sort比较器排序 var arr=[12,3,4,56,7,7]; arr.sort(com); for(var i in arr1){ if(arr[arr.length-1]==arr1[i]){ var index=i; } } txt1.value="max:"+arr[arr.length-1]+",index:"+index; } function com(a,b) { return a-b; } //二,假设比较思想:假设max=arr[0];index=0; 在循环往后比较,如果有比max大的数就让max记录下大的数,索引赋给index,循环做完,即得到满足条件的max与index;(if 判断大了赋新值,小了不管) function f2() { var arr=[12,3,4,56,7,7]; var max=arr[0]; var index=0; for(var i=1;i<arr.length;i++){ if(max<arr[i]){ max=arr[i]; index=i; } } txt2.value="max:"+max+",index:"+index; } //3,冒泡排序思想,内外循环,三目比较取大值,返回对比,匹配的可得对应索引; function f3(){ var arr=[12,3,4,56,7,7]; for(var i=1;i<arr.length-1;i++){//两两比较取大值 for(var j=i;j<arr.length-1;j++){ var max=arr[i-1]>arr[j]?arr[i-1]:arr[j]; } } for(var k in arr1){ if(max==arr1[k]){ var index=k; } } txt3.value="max:"+max+",index:"+index; } //二,冒泡排序(两两比较)思想:1,排序取大值及索引; // 2,后两个比较,较小的扔出去,否则交换,while循环结束,剩下的一个就是最大值,最后返回对比,匹配的可得对应索引; function f4() { var arr=[12,3,4,56,7,7]; while (arr.length>1){ if(arr[arr.length-1]<=arr[arr.length-2]){ arr.pop(); }else { arr[arr.length-2]=arr[arr.length-1]; var temp=arr[arr.length-2]; arr[arr.length-1]=temp; arr.pop(); } }// console.log(arr); var arr1=[12,3,4,56,7,7]; var max=arr[0]; var index=getMax_index(arr1,max);//封装方法:返回对比,匹配的可得对应索引;方法在后边。 txt4.value="max:"+arr[0]+",index:"+index; } //遍历前后比,if前者大就交换,遍历完就是小大排序,接收最后一个。 function f5() { var arr=[12,3,4,56,7,7]; var arr1=[12,3,4,56,7,7]; for(var i=0;i<arr.length-1;i++ ){ if(arr[i]>arr[i+1]){ var temp=arr[i+1]; arr[i+1]=arr[i]; arr[i]=temp; } } var max=arr.pop(); var index=getMax_index(arr1,max); txt5.value="max:"+max+",index:"+index; } //相互比,删除小的,剩下的就是最大的; function f6() { var arr=[12,3,4,56,7,7]; var arr1=[12,3,4,56,7,7]; while(arr.length>1){//相互比,删除小的 for(var j=0;j<arr.length-1;j++){ if(arr[j]<=arr[j+1]){ arr.splice(j,1); }else { arr.splice(j+1,1); } } } var max=arr[0]; var index=getMax_index(arr1,max); txt6.value="max:"+max+",index:"+index; } function getMax_index(arr,max) { for(var k in arr){ if(max==arr[k]){ var index=k; } } return index; }
/* 其他方法: 方法十一: //最小值 Array.prototype.min = function() { var min = this[0]; var len = this.length; for (var i = 1; i < len; i++){ if (this[i] < min){ min = this[i]; } } return min; } //最大值 Array.prototype.max = function() { var max = this[0]; var len = this.length; for (var i = 1; i < len; i++){ if (this[i] > max) { max = this[i]; } } return max; } 如果你是引入类库进行开发,害怕类库也实现了同名的原型方法,可以在生成函数之前进行重名判断: if (typeof Array.prototype[‘max‘] == ‘undefined‘) { Array.prototype.max = function() { ... ... } } 方法十二: 用Math.max和Math.min方法可以迅速得到结果。apply能让一个方法指定调用对象与传入参数,并且传入参数是以数组形式组织的。恰恰现在有一个方法叫Math.max,调用对象为Math,与多个参数 Array.max = function( array ){ return Math.max.apply( Math, array ); }; Array.min = function( array ){ return Math.min.apply( Math, array ); }; 但是,John Resig是把它们做成Math对象的静态方法,不能使用大神最爱用的链式调用了。但这方法还能更精简一些,不要忘记,Math对象也是一个对象,我们用对象的字面量来写,又可以省几个比特了。 Array.prototype.max = function(){ return Math.max.apply({},this) } Array.prototype.min = function(){ return Math.min.apply({},this) } [1,2,3].max()// => 3 [1,2,3].min()// => 1 方法十三: function getMaximin(arr,maximin) { if(maximin=="max") { return Math.max.apply(Math,arr); } else if(maximin=="min") { return Math.min.apply(Math, arr); } } var a=[3,2,4,2,10]; var b=[12,4,45,786,9,78]; console.log(getMaximin(a,"max"));//10 console.log(getMaximin(b,"min"));//04 方法十四: var a=[1,2,3,5]; alert(Math.max.apply(null, a));//最大值 alert(Math.min.apply(null, a));//最小值 多维数组可以这么修改: var a=[1,2,3,[5,6],[1,4,8]]; var ta=a.join(",").split(",");//转化为一维数组 alert(Math.max.apply(null,ta));//最大值 alert(Math.min.apply(null,ta));//最小值*/
</script>
<body><p>var arr=[12,3,4,56,7,7] 输出中数组中最大的数及索引:多种方式实现</p><input type="button" value="方法一" onclick="f1()"/><input type="text" id="txt1"/><br/><input type="button" value="方法二" onclick="f2()"/><input type="text" id="txt2"/><br/><input type="button" value="方法三" onclick="f3()"/><input type="text" id="txt3"/><br/><input type="button" value="方法四" onclick="f4()"/><input type="text" id="txt4"/><br/><input type="button" value="方法五" onclick="f5()"/><input type="text" id="txt5"/><br/><input type="button" value="方法六" onclick="f6()"/><input type="text" id="txt6"/><br/><input type="button" value="方法七" onclick="f7()"/><input type="text" id="txt7"/><br/><input type="button" value="方法八" onclick="f8()"/><input type="text" id="txt8"/><br/></body>
时间: 2024-11-29 01:40:35