您好,歡迎您來到「網路假期 - 答案共享資料庫」! 本系統是為了高雄市學生和其他縣市寒暑假作業使用網路假期系統的學生而開發的。 因為本系統解答資料數過於龐大,造成伺服器負擔龐大,每個寒暑假我們都會將解答資料清除重置,讓伺服器能減輕負擔! 歡迎加入開發者的 Discord 群組,最新消息也會在群組發布! 最新消息都會在粉專發布,快來按個讚! 網路假期 - 答案共享資料庫
2022年01月27日 00:00 · 阅读 670
这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战 插入排序贴一段搜狗百科的概述:
其实,插入排序的过程很像我们在斗地主时整理扑克牌时的场景,假如你现在拿到四张已经排好序的牌: 再摸到到一张7: 那么我们就会将这张7跟手里的牌进行比较,先跟9比较,再跟8比较,最后跟5比较,发现比5大,那么你就会把7放在5跟8之间。 简单来说,插入排序就是将未排序的元素一个一个插入到有序的集合中,插入的时候就像我们上面一样,从后向前扫一遍,找到合适的位置插入。 算法步骤一般来说,插入排序都采用在数组上实现。具体算法描述如下:
如下图所示: 代码贴贴:
到这里大家就应该知道插入排序是稳定的了吧,两个相同的元素在排序的时候他们之间的相对位置是不会改变的,这是因为我们在从后往前遍历的时候,遇到相同元素就直接插入在它后面了,相对位置是没有发生变化的。 插入排序的优化二分法插入排序插入排序的时间复杂度是O(n^2),空间复杂度为O(1),那么对于这个排序算法,是否还有优化的空间呢?答案是肯定的。 我们可以发现,在插入新元素的时候,前面的序列已经是有序的了,既然如此,对于有序的序列,我们可以引入二分法,找到新元素该插入的位置,再将元素插入! 代码贴贴:
希尔排序不管是上面的直接插入排序还是二分法插入排序,我们在找到插入位置的时候,都需要将元素向后面移动,这部分的工作是最耗时的。 为了理解上面所说的,我们看下图,我们将数组按照增量为5进行分组: 对这五组数据分别进行直接插入排序,结果如下,可以看到,像3、5、6这些小元素都被调到前面去了,然后缩小增量,gap=5/2=2,数组被分成2组[3,1,0,9,7],[5,6,8,4,2]。 对以上2组再分别进行直接插入排序,结果如下,此时整个数组的有序程度更进一步,再缩小增量gap=2/2=1,此时,整个数组就被分为一组了。 此时,我们的数组在宏观上上已经是基本有序了,再对其进行插入排序的时候,仅仅只需要微微调整,无需大量移动操作就可以对数组排好序了。 代码贴贴:
在希尔排序中,增量的选择是非常重要的,直接影响到希尔排序的性能,一般来说最简单的增量取值是初次取数组长度的一半为增量,之后每次再减半,直到增量为1。 结尾本文介绍了插入排序,由以扑克牌的例子引出插入排序的思想,在插入排序的基础上我们引入了二分法对其进行了优化,俗称二分法插入排序。 |