直接插入排序

英勇青铜

算法思路

两个数组:待排序数组disorderArray和有序数组orderArray
从待排序数组中取一个数disorderArray[i]
依次和有序数组中每个数比较
小于元素orderArray[j]
先将位置j及之后的元素向后移动一位
再插入到位置j
一直都不小于,
则直接插入到orderArray[orderArray.length]

注意

disorderArray[i]orderArray[j]比较时:
从左向右,条件disorderArray[i]<orderArray[j]
从右向左,条件disorderArray[i]>orderArray[j]
如果加上等于,可以少比较一次,但是要多做一次移动

算法实现

function InsertSort(disorderArray) {
    var i, j, k;
    var orderArray = [];
    //第0个元素不用排序
    orderArray[0] = disorderArray[0];
    //从第1个元素开始,依次取出待排序数组中的元素
    for (i = 1; i < disorderArray.length; i++) {
        //依次和有序数组元素比较
        for (j = 0; j < orderArray.length; j++) {
            //小于等于元素,则找到了要插入的位置orserArray[j]
            if (disorderArray[i] < orderArray[j]) {
                break;
            }
            //如果j == orderArray.length,那么disorderArray[i]是最大的
            //直接插入到j位置,不用再移动orderArray
        }
        //将位置j及之后的元素后移一位,j == orderArray.length时正好跳过循环
        for (k = orderArray.length; k > j; k--) {
            //有序数组会增1,从length+1开始从后向前到j插入到j+1
            orderArray[k] = orderArray[k - 1];
        }
        //插入到合适的位置
        orderArray[j] = disorderArray[i];
    }
    console.log(orderArray);
}

var disorderArray = [5, 3, 8, 1, 6, 4];
InsertSort(disorderArray);

不屈白银

算法思路

一个数组:orderArray
首先将 orderArray[0] 看成有序数组
然后从 orderArray[1] 开始插入到有序数组中
目标就是将待排部分全部插入到有序部分

算法实现

function InsertSort(orderArray) {
    //辅助交换
    var temp;
    //依次取出待排序部分的元素orderArray[i],从1开始
    for (var i = 1; i < orderArray.length; i++) {
        //待排部分和有序部分从右向左进行比较
        for (var j = i - 1; j >= 0; j--) {
            //待排元素大于则插入,找到要插入的位置j+1
            if (orderArray[i] >= orderArray[j]) {
                break;
            }
        }
        temp = orderArray[i];
        //待排元素位置到插入位置之间的元素需要移动
        for (i; i > j + 1; i--) {
            orderArray[i] = orderArray[i - 1];
        }
        orderArray[j + 1] = temp;
    }
}

var orderArray = [9, 3, 7, 1, 4, 2, 5, 0, 6, 8]
InsertSort(orderArray);
console.log(orderArray);

荣耀黄金

算法思路

待排部分和有序部分比较时
若待排元素小于有序元素,则将有序元素后移
若待排元素大于等于有序元素,则待排元素位置确定,插入该位置
跳出此次循环
目标任然是将待排元素插入到有序部分

注意

比较条件写到for循环中

function InsertSort(orderArray) {
    //辅助交换
    var temp;
    //依次取出待排序部分的元素orderArray[i],从1开始
    for (var i = 1; i < orderArray.length; i++) {
        temp = orderArray[i];
        //待排部分和有序部分从右向左进行比较
        for (var j = i - 1; j >= 0 && temp < orderArray[j]; j--) {
            //待排元素小于则后移
            orderArray[j + 1] = orderArray[j];
        }
        //待排元素插入
        orderArray[j + 1] = temp;
    }
}

var orderArray = [9, 3, 7, 1, 4, 2, 5, 0, 6, 8]
InsertSort(orderArray);
console.log(orderArray);

华贵铂金

算法思路

待排部分和有序部分比较时
若待排元素小于有序元素,则两者进行位置交换,继续比较
若待排元素大于等于有序元素,则待排元素位置确定,跳出此次循环
目标任然是将待排元素插入到有序部分

注意

每次只是进行两个元素的比较
其中一个是待排元素
这种方式可能不是直接插入排序

算法实现

function InsertSort(orderArray) {
    //辅助交换
    var temp;
    //依次取出待排序部分的元素orderArray[i],从1开始
    for (var i = 1; i < orderArray.length; i++) {
        temp = orderArray[i];
        //待排部分和有序部分从右向左进行比较
        for (var j = i - 1; j >= 0; j--) {
            //待排元素小于则交换位置
            if (temp < orderArray[j]) {
                orderArray[j + 1] = orderArray[j];
                orderArray[j] = temp;
            } else {
                break;
            }
        }
    }
}

var orderArray = [9, 3, 7, 1, 4, 2, 5, 0, 6, 8]
InsertSort(orderArray);
console.log(orderArray);
posted @ 2018-07-20 16:09  言凡  阅读(306)  评论(0编辑  收藏  举报