zoukankan      html  css  js  c++  java
  • js实现数组排序

    1. JavaScript的sort()方法

    var array = [1,4,-8,-3,6,12,9,8];
    function compare(val1,val2){
        return val1-val2;
    };
    array.sort(compare);
    document.write(array);
    

    sort()方法按照升序排列数组项,会调用每个数组项的toString()转型方法,然后比较得到的字符串。
    toString()方法是把布尔值或BooleanObject转换为字符串,并返回结果。
    compare()函数方法是一个比较函数,作为sort()方法的参数。

    2. 冒泡排序(从后向前)

    var array = [1,4,-8,-3,6,12,9,8];
    function sort(arr){
        for(var j=0;j<arr.length-1;j++){
        //两两比较,如果前一个比后一个大,则交换位置。
           for(var i=0;i<arr.length-1-j;i++){
                if(arr[i]>arr[i+1]){
                    var temp = arr[i];
                    arr[i] = arr[i+1];
                    arr[i+1] = temp;
                }
            } 
        }
    }
    sort(array);
    document.write(array);
    

    (1)比较相邻的元素。如果第一个比第二个大,就交换他们两个位置。
    (2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    (3)针对所有的元素重复以上的步骤,除了最后一个。
    (4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

    3. 快速排序:递归思想,两边快速的排序,冒泡排序的改进

    var array = [1,4,-8,-3,6,12,9,8];
    function quickSort(arr){
    //如果数组长度小于等于1,则返回数组本身
        if(arr.length<=1){
            return arr;
        }
        //定义中间值的索引
        var index = Math.floor(arr.length/2);
        //取到中间值
        var temp = arr.splice(index,1);
        //定义左右部分数组
        var left = [];
        var right = [];
        for(var i=0;i<arr.length;i++){
        //如果元素比中间值小,那么放在左边,否则放右边
            if(arr[i]<temp){
                left.push(arr[i]);
            }else{
                right.push(arr[i]);
            }
        }
        return quickSort(left).concat(temp,quickSort(right));
    }
    document.write(quickSort(array));
    

    Math.floor(x)方法是向下取整,返回小于或等于x的最接近的整数。
    splice(index,num,item)方法是向数组中添加项目,或是从数组中删除项目,并返回被删除的项目。
    (1)index是整数,被操作项目所在的位置(必须)
    (2)num是整数,要删除的项目的数量,如果为0,表示不删除(必须)
    (3)item是向数组中添加的新项目,可以是多个(可选)
    push()方法是向数组末尾添加一个或多个新项目并返回新数组的长度
    concat()方法连接两个或多个数组,不会改变原有数组,返回一个新数组

    4. 插入排序

    var array = [1,4,-8,-3,6,12,9,8];
    function insertSort(arr){
    //假设第0元素是有序序列,第1元素之后是无序的序列。从第1元素开始依次将无序序列的元素插入到有序序列中
        for(var i=1; i<arr.length;i++){
            if(arr[i]<arr[i-1]){
                //取出无序序列中需要插入的第i个元素
                var temp = arr[i];
                //定义有序中的最后一个位置
                var j = i-1;
                arr[i] = arr[j];
                //比较大小,找到插入的位置
                while(j>=0&&temp<arr[j]){
                    arr[j+1] = arr[j];
                    j--;
                };
                //插入
                arr[j+1] = temp;
            }
        }
      }
    insertSort(array)
    document.write(array);
    

    (1)从第一个元素开始,该元素可以认为已经被排序
    (2)取出下一个元素,在已经排序的元素序列中扫描
    (3)如果该元素(已排序)大于新元素,将该元素移到下一位置
    (4)重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
    (5)将新元素插入到下一位置中
    (6)重复步骤2

    5. 选择排序

    var array = [1,4,-8,-3,6,12,9,8];
    function selectSort(arr){
        for(var i=0;i<arr.length;i++){
            //设置当前范围最小值和索引
            var min = arr[i];
            var minIndex = i;
            //在该范围选出最小值
            for(var j=i+1;j<arr.length;j++){
                if(min>arr[j]){
                    min = arr[j];
                    minIndex = j;
                }
            }
            //将最小值插入,并将原来位置的最小值删除
            arr.splice(i,0,min);
            arr.splice(minIndex+1,1);
        }
    }
    selectSort(array);
    document.write(array);
    

    (1)在未排序序列中找到最小(大)元素
    (2)并存放到排序序列的起始位置
    (3)然后,再从剩余未排序元素中继续寻找最小(大)元素
    (4)然后放到已排序序列的末尾。
    (5)以此类推

    6. 原生 javascript 数组排序

    function order(arr){
        var len=arr.length;
        var max=0; // 定义一个变量max,用于保存数组中的最大值。
        var num=0; // 定义一个变量num,用于保存数组中最大值的位置。
        var mid=0; // 定义一个变量mid,用于交换最大值和最后一个值。
        for(var i=len-1;i>0;i--){
            max=arr[0];
            for(var j=0;j<=i;j++){
                if(max<=arr[j]){ 
                    max=arr[j]; // 获取数组中最大值
                    num=j;
                }
            }
            mid=arr[i]; // 将数组最后一个元素的值赋给中间变量;
            arr[num]=mid; // 将中间变量赋给最大值的元素;
            arr[i]=max; // 将最大值赋给数组最后一个元素;
        }
        return arr;
    }
    

    方法/步骤

    1.获取数组中最大的元素

    var arr=[1,2,4,6,3,7,5];
    var max=0;
    for(var i=0;i<arr.length;i++){
        if(max<=arr[i]){
            max=arr[i];
        }
    }
    

    2.把最大值放到数组最后:
    *定义一个中间变量来交换最大值和最后一个元素的值;
    *定义一个变量来保存最大值所在的位置;

    var arr=[1,2,4,6,3,7,5];
    var len=arr.length;
    var max=0;
    var num=0;
    var mid=0;
    for(var i=0;i<len;i++){
      if(max<=arr[i]){
        max=arr[i];
        num=i;
      }
    }
    mid=arr[len-1]; // 将数组最后一个元素的值赋给中间变量;
    arr[num]=mid; // 将中间变量赋给最大值的元素;
    arr[len-1]=max; // 将最大值赋给数组最后一个元素;
    // [1,2,4,6,3,5,7];
    

    3.使用第二重循环来执行第2步:

    var arr=[1,2,4,6,3,7,5];
    var len=arr.length;
    var max=0;
    var num=0;
    var mid=0;
    for(var i=len-1;i>0;i--){
        max=arr[0];
        for(var j=0;j<=i;j++){
            if(max<=arr[j]){ 
                max=arr[j]; // 获取数组中最大值
                num=j;
            }
        }
    mid=arr[li]; 
    arr[num]=mid; 
    arr[i]=max; 
    

    4.把第3步封装在函数中:

    function order(arr){
        var len=arr.length;
        var max=0; // 定义一个变量max,用于保存数组中的最大值。
        var num=0; // 定义一个变量num,用于保存数组中最大值的位置。
        var mid=0; // 定义一个变量mid,用于交换最大值和最后一个值。
        for(var i=len-1;i>0;i--){
            max=arr[0];
            for(var j=0;j<=i;j++){
                if(max<=arr[j]){ 
                    max=arr[j]; // 获取数组中最大值
                    num=j;
                }
            }
            mid=arr[i]; // 将数组最后一个元素的值赋给中间变量;
            arr[num]=mid; // 将中间变量赋给最大值的元素;
            arr[i]=max; // 将最大值赋给数组最后一个元素;
        }
        return arr;
    }
    

    注意事项

    数字排序为升序排列!
    这种方法会改变原始数组!

  • 相关阅读:
    java操作生成jar包 和写入jar包
    jboss配置jndi连接池
    windows 域的LDAP查询相关举例
    LDAP error Code 及解决方法
    HDU 6417
    CF1299D Around the World
    codechef Chef and The Colored Grid
    Educational Codeforces Round 82 (Rated for Div. 2)
    CF1237F Balanced Domino Placements
    CF1254E Send Tree to Charlie
  • 原文地址:https://www.cnblogs.com/web-record/p/9109754.html
Copyright © 2011-2022 走看看