算法思维之插入排序
Posted AlphaCloud
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法思维之插入排序相关的知识,希望对你有一定的参考价值。
本文向大家介绍插入排序算法,如果你已经对插入算法的思想很了解了,可以直接忽略看下面一篇地文章了。
为什么我要一上来就讲插入排序呢,因为这些基础的排序算法,都是我们学习算法思维的思维基础。
排序算法有很多,用的最多的应该就是快速排序了,而快速排序的效率也是最高的,我上面也提到了,为什么快速排序效率最高,我们还要学习其他算法呢?所以说我们要学习的不只是这些经典算法本身,更要学习的是这些算法的思维,举一反三,运用这些思维去解决问题。
先说说排序算法一般的形式。首先会给定一个定长的数组,数组的类型是int类型,其中的数字顺序是乱序的,要求我们对数组内的元素进行排序。
什么是插入排序,这个算法的实现,正好和我们玩扑克一样。就拿斗地主来说吧,我们需要把摸到的每一张牌按照从小到大顺序排好,比如现在手中有了2、4、5、10,那么新摸上来一张7,是不是要找到正确的位置之后插入进来呢。不过摸牌和我们的算法有点不太一样。我们家里玩牌应该遇到过可能某个人在摸牌阶段去厕所了,然后我们会帮他把牌摸好扣着,等他来了之后,他在把摸好的一把牌按顺序排好,这个过程就和我们的插入排序一摸一样了。
这里举个算法的实际例子。现在有一个长度为7个数组,其中的元素按顺序分别为63、88、34、99、38、55、9。现在要求对数组做从小到大的排序。
插入排序算法的核心思想就是,把数组分为两部分,一部分是未排好序的部分,另一部分是已经排好序的部分。一开始,已经排好序的部分没有数据。
我们拿上面提到的数组为例,这里已经排好序的部分可以在数组的前面部分,也可以在数组的后面部分。这次我们就把已经排好序的部分放到数组的前面部分,这样数组的前面部分就是已经排好序的。
我们从左到右扫面这个数组,看到第一个元素为63,他是已排好序的部分中的第一个元素。接着扫描后面的元素,88,发现88大于已排好序的部分的最后一个元素,满足我们的排序要求,可以不用动。这时候已排好序的部分有两个元素了。
接着我们扫描到了第三个元素,发现比88(已排好序部分的最后一个元素)小,这时候需要往前插入,于是与已排好序的部分的每一个元素依次向前比较,找到它应该在的位置,于是,34排到了第一位,这时候数组的元素顺序变成了34、63、88、99、38、55、9。
接着向后扫描,发现元素99,这个99也是比已排好序的部分的最后一个元素大,不用动,这时候已排好序的部分已经有34、63、88、99了。接下来我们继续扫描,发现38,比99小,于是依次向前一个个点比较,依次交换位置,数组变成34、63、88、38、99、55、9,接着变成34、63、38、88、99、55、9,最后找到它应该的位置,数组变为34、38、63、88、99、55、9。
接着继续扫描下去,发现55比99小,于是和38一样的移动方式,得到移动后的结果为34、38、55、63、88、99、9,这时候,已排好序的部分是前6个元素,未排序的部分就是一个元素9了,同样按照上面的方式,得到结果为9、34、38、55、63、88、99,至此,排序完成。
相信大家看到这,应该已经了解了排序算法的核心思维了。为在这里总结一下。
首先需要明确数组的两个部分,也就是已排好部分和待排部分。
接着我们每次拿待排部分的第一个或者最后一个元素(取决于扫描是从前往后还是从后往前)与已排好部分的第一个或者最后一个元素(这个取决于你的心情)开始依次比较并移动,最终找到合适的位置。
一直重复上面的步骤知道整个数组扫描完。
插入排序的时间复杂度为O(n^2),由于扫描后还需要一个个点移动,导致算法是个嵌套循环。空间复杂度为O(1),也就是没有使用到额外的空间。我们应该可以意识到,如果数组本身近似有序,那么可以减少交换位置的移动,由此可以达到更好一些的性能。
长话短说,插入排序的相关内容到此结束。这里讲的是直接插入排序,实际上还有一种是二分插入排序,有兴趣的自己搜寻一下。
这篇内容比较简单,大家有意见可以提,本身它也是为了下一篇做个伏笔。
长按上方二维码
立即关注
AlphaCloud
以上是关于算法思维之插入排序的主要内容,如果未能解决你的问题,请参考以下文章
无法从第三版算法介绍中获得插入排序。正确的。我的思维错误在哪里?