大家好,我是你们的考试专家。今天咱们不整那些高大上的定义,讲讲插入排序,就是那个最像“民间算法”的排序能手。 想象你手里有一叠乱成一团的扑克牌,要么书架上书架位置乱七八糟的书。咱们不急着把书搬到同一层,而是找个位置,把这一叠牌抽出来,搞定来再插进去,最终把位置理顺。
这个抽出来插进去的过程,就是插入排序的核心逻辑。 算法运行起来就是这种“动一动的”感觉。咱们要处理一段数列,实际上是从第二个数启动,它一启动就待在它当前位置,没惹事。
然后我们要盯着它后面的数,看看能不能把后面的数挪那会儿,让前面的数越来越顺。 举个例子,数组是 [12, 3, 4, 5]。先拿 12 当“基准”,这已经是它自己的家了,不用动。
接着看 3。3 比 12 小,这就得把 12 往后挪一挪,腾出一个空位。
这时候数组变成了 [3, 12, 4, 5]。3 正好插到了第一位,这波操作叫“插入”,3 归位了。 持续看 4。4 比 3 大,不能插到前面去。
那得看看 4 能不能插到 3 和 12 中间的位置?
要么,看 5?5 比 3、4、12 都大,那 5 得往后挪。
要是再往后挪,后面所有的大数都得跟着往后沉。
这时候 12 得再往后挪,腾出空位。目前 4 只能插到 4 和 5 之间,数组变成 [3, 4, 12, 5]。4 归位了。 这时候算法有点“偷懒”了,它发现后面的数都比 4 大,说明 4 已经插好了,后面都不用再动了,直接终止。最终数组变成 [3, 4, 5, 12]。
你看,这个过程就像是在路上开车,前面的车(小的数)不动,后面的车(大的数)慢慢从后面绕过来,一辆一车的,直到所有车都排好序。 插入排序实际上挺有讲究的,它每次只能处理一个数。别看有点慢,但在数据量特别小的时候特别香,比如处理极少的数组,要么处理带有大量重复元素的数组,它那种“动一挪一挪”的方式效率挺高。 再深入一点,插入排序有个特征,它不是原地换,而是比较、移动、再比较、再移动,这一步比较费事。并且它需求用到两个指针,一个指向“基准”数,一个指向要插入的数,哪位大哪位就向着哪位移动,哪位小哪位就跟着基准数动。 不过,插入排序也有它自己的脾气。
比如它最怕啥?就是顺序特别乱,要么数据量特别大的时候。
这时候它跑起来就像蜗牛爬树,效率低,常数也大。
故此插入排序一般只用在那些数据量不大,要么已经相当有序的数据前面。它就像一个老实巴交的工人,只能一次干一件事,干完一件就停下来,等下一个数来。 在实际写代码的时候,我们要注意它的边界情况。
第一个元素本来就在位子上,不需求做任何比较,直接终止。后面每一个元素都要跟前面的元素比较,要是符合条件就换位置,直到整个序列都排好。 总而言之,插入排序就像是给一团乱麻做手工。你先把一根线挑出来,再一根一根地穿那会儿,别看慢,但稳妥,特别适合数据少要么略微有点序的情况。在考试或面试里,提到它,大家能一眼看出它的动作,知道它是如何一个个数来排对的,这就是它的精髓。