zoukankan      html  css  js  c++  java
  • 【找数组元素最大值的十四种方法】for【练习知识点和总结】

    以下是心血成果,版权所有,未经允许,不得转载。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>
  • 相关阅读:
    浏览器事件.html
    奇数(11~99)四个一行输出.html
    JDBC系列教材 (十一)- 数据库连接池
    JDBC系列教材 (十)- 基于JDBC设计DAO的实例
    JDBC系列教材 (九)- 使用JDBC做一个ORM例子
    JDBC系列教材 (八)- 如何在JDBC中使用事务
    JDBC系列教材 (七)- 获取自增长id以及表的元数据
    JDBC系列教材 (六)- 中execute与executeUpdate的区别
    JDBC系列教材 (五)- 在JDBC中使用预编译Statement 以及它的优点
    JDBC系列教材 (四)- 在JDBC中使用ResultSet查询SQL语句
  • 原文地址:https://www.cnblogs.com/ljt1412451704/p/8053169.html
Copyright © 2011-2022 走看看