插入排序(保姆级教学)

文章详细解释了插入排序的工作原理,将其与冒泡排序进行对比,并通过代码示例展示了如何实现插入排序。插入排序通过建立有序数组并逐个插入新元素来实现排序,而冒泡排序则是通过相邻元素的不断交换。文章提供了具体的步骤和示例,帮助读者理解这一算法。
摘要由CSDN通过智能技术生成


插入排序算得上是冒泡排序的一种优化,那插入排序应该怎么写?(让我们慢慢研究一下) ̄︶ ̄)↗ 


不管怎么说当我第一眼看到这张图片的时候一个字———懵。这啥啊完全看不懂啊(╯°□°)╯︵ ┻━┻
后来我研究后才明白了这张图的意思。这里在第一排给到了一个原始数据大致的看下来可能有的人会产生怎么看着跟冒泡排序差不多的想法啊?但它俩的原理还是有所不同的:冒泡排序是把所有的数放在一起挨个挨个换位进行比较,插入排序它就比较聪明它首先让开头的一个数自成一个有序数组然后再让其他的数字与有序数组进行大小比较排序(按照从后往前对比的规则,如果遇到

 一个数比前面目数大,则插入这个数前面)。


这么说大家可能不太能理解(其实我也不太能X﹏X))那俺就直接举例子吧:拿我们的原数据来说,开头的数字为“4”那么我们就把“4”拿出来单独当做一个有序数列(其他的数组成无序数列)后面再引入一个“3”让“3”跟“4”进行比较,如果“3”比“4”小那么就让“3”与“4”交换位置(“3”与“4”构成了一个新的有序数组),这样就完成了第一趟排序。下面将进行帽子戏法。再引入一个新的数“2”,让“2”跟排在数组最后面的“4”进行比较,如果“2”比“4”小那么就把“2”与“4”交换位置,再让“2”与前面的“3”进行比较,“2”比“3”小就让“2”与“3”交换位置(如果“2”比“3”大那“2”就要停留在现在的位置)以此类推我们就完成了第二趟排序。那么比较的要诀就是让新来的数与有序数列进行比较(从有序数列的后面往前比),如果比前面位置的数小就交换两者的位置直到你新引进的数比你前面比较的数

 大那就停止比较(交换的具体过程可以参考我写的关于冒泡排序的交换规则)

 

 
也不知道你们懂了没,上个代码演示一下吧

var arr = [4, 3, 2, 10, 12, 1, 5, 6]; //定义一个名叫arr的数组
        for (var i = 1; i < arr.length; i++) { //把无序数组里面的数都遍历
            for (var j = i; j > 0; j--) { //用来从后往前遍历所以有序数组
                if(arr[j] < arr[j - 1]) { //比较新加入的数与有序数列里面的的大小
                    var temp = arr[j];  //交换位置
                    arr[j] = arr[j - 1];
                    arr[j - 1] = temp;
                }
            }
        }
        console.log(arr); //输出结果为:[1, 2, 3, 4, 5, 6, 10, 12]

 那下面我就为呆呆的你讲解一下这段代码吧

var arr = [4, 3, 2, 10, 12, 1, 5, 6];

这里表示我们创建了一个名为arr的数组里面有若干个元素

for (var i = 1; i < arr.length; i++){
   //代码块
   //代码块

这个for循环它的i是从1开始的。这个时候就有很多小朋友问了为什么呢?因为我们需要默认数组中第一个数([0])是有序的,这个for循环是循环的无序数组所以我们需要从[1]开始遍历我们的无序数组。让 i < arr.length 这样我们就能把所有的无序数组遍历完成啦。

     var arr = [4, 3, 2, 10, 12, 1, 5, 6]; 
        for (var i = 1; i < arr.length; i++) {
            for (var j = i; j > 0; j--) {
                if(arr[j] < arr[j - 1]) {
                    var temp = arr[j];
                    arr[j] = arr[j - 1];
                    arr[j - 1] = temp;
                }
            }
        }

当内层for循环取出有序数组中需要比较的数与无序数组中需要比较的数后,再用if语进行比较(如果符合if语句的条件就交换彼此的位置(这一点跟冒泡排序很像,如果有不懂的朋友可以查看我写的关于冒泡排序的内容) 

干说还是不太清楚,那我们就举例说明吧:比如我现在是定义的“4”为单独的一个有序数组,然后我进入外层for循环此时i = 1,进入内层for循环这时直接进入if语句,我们就做到了拿出[0]与[1]比较(有序数组与无序数组的比较)满足条件就进行交换反之直接进入下一次循环,这时i = 2;那么进入for循环再直接进入if语句就做到了[2]与[1]的比较(有序数组与无序数组的比较)满足条件就进行交换,这时交换完后j--就发挥了作用让交换了位置的新人与旧朋友进行对比位置[1]与[0]对比(注意:这个时候[1]里面的数据是已经变了的)满足条件就进行交换,不满足条件就进行下次for循环,以此类推.......我们就完成了插入排序。(不懂如何交换两个个数据位置的同学可以去看我写的冒泡排序交换位置的文章原理差不多这里就不再废话了φ(* ̄0 ̄))

既然你都看完了,那能不能留下一个免费的赞呢?(^///^) 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值