读《算法导论》第2章 算法基础--2.1插入排序

在高中讲流程图以及大学学c都会遇到一些排序,所以对这些词我一直都是属于听过,但是是啥具体说不清,然后看到书里的一张图。


读《算法导论》第2章 算法基础--2.1插入排序_第1张图片
插入排序

作为一个从小就玩扑克和麻将的我来说,在自己抓牌的时候往往会一边抓一边排(不像现在手游的自动排好,不过有的是发完牌,然后给你排序),然后因为自己对JQK等哪个大基本属于不用过脑就把牌从大到小排列了,而如果我们没那么熟悉呢,我们会拿着抓来的牌,来跟手里的第一张牌(左还是右看习惯吧)比大小,然后依次比较,放到较好合适的地方,然后手里的牌就排好了。

然后上代码:

let arr = [5, 2, 8, 4, 3, 10, 7];
for (let j = 1; j < arr.length; j++) {
    let key = arr[j],
        i = j - 1;
    while (i >= 0 && arr[i] > key) {
        arr[i + 1] = arr[i];
        i = i - 1;
    }
    arr[i + 1] = key;
}
console.log(arr);//[ 2, 3, 4, 5, 7, 8, 10 ]

先看结构,是一个for循环和while循环的嵌套,先不看while循环,代码从上到下对原数组没有变化,所以如果原数组本来就排好了那么就没什么影响,然后看while部分(书中伪代码的for循环是j从2开始,然后while里面的判断是i>0),当前面的元素比后面的元素大,那么就把这两个调换,比如我们把数组的元素看成扑克牌,我手里有张5,然后抓来个2,比5小,我就把2插入5前面,然后我抓个8,发现都比他小,那么我就把它放在本该在的位置(第三张牌),然后依次下去,最终就将牌排好,也就是拿抓来的牌跟他前面的比,如果遇到比他大的,那么就插到他前面,不然就在老地方呆着。

你可能感兴趣的:(读《算法导论》第2章 算法基础--2.1插入排序)