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).

原文地址:https://www.cnblogs.com/renbo/p/8228361.html