以下是心血成果,版权所有,未经允许,不得转载。Author:李金涛; AT:2017-12-17 20:24.(方便以后,再次修改)
<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>