zoukankan      html  css  js  c++  java
  • js排序算法02——插入排序

    插入排序的思路是我们默认数组的第一个元素是有序的,从第二个元素开始依次和前面的元素比较,如果前面的元素大,就将前面的元素往后移一位,如果前面的元素小,就把该元素放在前面元素的后面。其实就和我们玩扑克牌差不多的,每次拿牌后,把大牌放后面,小牌放前面。按照这个思路,实现了如下代码:

    function insertSort(arr){
        if(!Array.isArray(arr)){
            return false;          //类型判断
        }
        else{
            var result=[];                //定义一个新数组
            result.push(arr[0]);       //默认第一个为有序的
            for (var i = 1; i < arr.length; i++) {
                var lgh = result.length-1;
                for (var j = lgh; j >= 0; j--) {
                    if(arr[i]<result[j]){
                        result[j+1] = result[j];
                    }
                    else{
                        break;
                    }
                }
                result[j+1] = arr[i];
            }
            return result;
        }
    }

    实现了之后看到大佬的文章好像都没定义新的数组,感觉很厉害的样子,于是又优化了自己的代码,优化后的代码如下

    function insertSort(arr){
        if(!Array.isArray(arr)){
            return false;          //类型判断
        }
        else{
            for (var i = 1; i < arr.length; i++) {
                var current = arr[i];
                var j = i-1;
                while(current<arr[j]&&j >= 0){
                    arr[j+1] = arr[j];
                    j--;
                }
                arr[j+1] = current;
            }
            return arr;
        }
    }

    算法分析:最好的情况(已经是顺序)时间复杂度为O(n),最坏的情况(逆序),时间复杂度为O(n2).

  • 相关阅读:
    bzoj2888: 资源运输
    [ SDOI 2009 ] HH的项链 & [ HEOI 2012 ] 采花
    [ POI 2017 ] Podzielno
    [ HAOI 2011 ] Problem A
    [ SDOI 2011 ] 打地鼠
    [ SCOI 2007 ] Perm
    [ POI 2011 ] Dynamite
    [ BZOJ 3038 & 3211 / SPOJ GSS4 ] 上帝造题七分钟2 / 花神游历各国
    [ BZOJ 3445 ] Roadblock
    [ ZJOI 2006 ] Mahjong
  • 原文地址:https://www.cnblogs.com/renbo/p/8228361.html
Copyright © 2011-2022 走看看