【插入排序】
【基本原理】
两个区域
排序区
未排序区
用一个索引值来区分
未排序区元素
与排序区元素比较
插入到合适位置
直到未排序区清空
排序开始前,首先认为第一个元素在排序区中,其它所有元素在未排序区中。
排序开始后,每次将未排序区第一个元素取出用于和排序区中元素比较。如果满足条件(较大或者较小),则排序区中元素往后移动一个位置。
注意
所有数字都在一个数组中
所谓的两个区域是一个分水岭索引
【关键逻辑】
循环n-1次
有n个数就循环n-1次
每一轮
取出未排序区的第一个元素
得到排序区最后一个元素的索引位置
第一轮
未排序的第一个元素
noSortNum = 7
排序区的最后一个元素索引
sortIndex = 0
第二轮
noSortNum = 9
sortIndex = 1
以此类推
确定插入位置
用未排序区第一个元素
从已排序区最后一个元素开始
依次往前比较
如果满足条件
已排序区元素往后移动一个位置
插入数字
【标准实现】
排序结果
【逻辑分析】
-为什么有两层循环-
第一层循环
依次取出未排序区的元素进行排序
第二层循环
找到想要插入的位置
-为什么第一层循环从1开始遍历-
插入排序的关键是分两个区域
已排序区
未排序区
默认第一个元素在已排序区
每一轮循环的目的是
依次取出未排序区的元素进行排序
-为何用while循环-
之前学习的冒泡排序和选择排序,之所以第二层循环是for循环,是因为它们每一轮都需要和数组中剩下的所有元素进行比较,不存在中途停止循环的情况。而插入排序,在比较过程中,只要条件不满足就马上要停止比较,所以while循环更适用!(当然用for循环也是可以实现的)
满足条件才比较
否则证明插入位置已确定
不需要继续循环
-为什么可以直接往后移位置 为什么后移结束要减减-
每轮未排序数已记录
最后一个位置不怕丢
减减比较下一数
以此类推找位置
-为什么确定位置后 是放在sortIndex + 1的位置-
接着会进行比较
这时sortIndex = 0,而3小于4所以不会再进循环了,因此循环结束,证明4应该放在1的位置,也就是sortIndex + 1的位置。所以这里的逻辑总结一下就是:当循环停止时,插入位置应该是停止循环的索引加1处!
-如何降序排列-
升序(从小到大)
降序(从大到小)
具体是哪种排序
关键点就是条件表达式
如果是大于(>)
已排序数大于未排序数
则进入循环继续往前找
也就是要把小的数往前放
结果就是升序排序
如果是小于(<)
已排序数小于未排序数
则进入循环继续往前找
也就是要把大的数往前放
结果就是降序排序
【练习】
之前的冒泡排序和选择排序,我们都知道他们是没有固定写法的,可以从前往后遍历,也可以从后往前遍历。而插入排序也是没有固定写法的,目前我们实现的是默认第一个为已排序区元素,如果你对插入排序已经了解了,可以自己尝试实现默认最后一个元素为已排序区元素,来实现插入排序。
【总结】
-基本原理-
两个区域
用索引值来区分
未排序区与排序区
元素不停比较
找到合适位置
插入当前元素
-套路写法-
两层循环
一层获取未排序区元素
一层找到合适插入位置
第一个未排序元素值
最后一个已排序元素索引
用未排序元素值
依次遍历比较已排序元素
找到合适位置
第二层循环外插入
-注意事项-
默认开头已排序
默认结尾已排序
第二层循环外插入
关注唐老狮获取更多干货内容