插入排序

就想着自己在打扑克牌,接起来一张,放哪里无所谓,再接起来一张,比第一张小,放左边,继续接,可能是中间数,就插在中间....依次

通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

外循环好像起牌,不算拿的第一张,从第二张到最后一张

内循环来比较,对于外循环的牌,逐一逆序两两比较,小的就往前插入,主要遇到大牌就停止

  • 首先将待排序的第一个记录作为一个有序段

  • 从第二个开始,到最后一个,依次和前面的有序段进行比较,确定插入位置

function insertSort(arr) {
    for(let i = 1; i < arr.length; i++) {  //外循环从1开始,默认arr[0]是有序段
        for(let j = i; j > 0; j--) {  //j = i,将arr[j]依次插入有序段中
            if(arr[j] < arr[j-1]) {
                [arr[j],arr[j-1]] = [arr[j-1],arr[j]];
            } else {
                break;
            }
        }
    }
    return arr;
}

分析: 注意这里两次循环中,ij的含义:

  1. i是外循环,依次把后面的数插入前面的有序序列中,默认arr[0]为有序的,i就从1开始

  2. j进来后,依次与前面队列的数进行比较,因为前面的序列是有序的,因此只需要循环比较、交换即可

  3. 注意这里的break,因为前面是都是有序的序列,所以如果当前要插入的值arr[j]大于或等于arr[j-1],则无需继续比较,直接下一次循环就可以了。

最后更新于