手撕插入排序及其优化(希尔排序)
Posted 不迷途
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手撕插入排序及其优化(希尔排序)相关的知识,希望对你有一定的参考价值。
点击蓝字
关注不迷途
插入排序,遍历未排序元素,插入到有序的数组内。
![手撕插入排序及其优化(希尔排序)](https://image.cha138.com/20210425/d507ef849bc74138b5e3e2fcd807cf1c.jpg)
![手撕插入排序及其优化(希尔排序)](https://image.cha138.com/20210425/dfee4918358a4838ac5669e11c6c7172.jpg)
插入排序的实现很简单,但是时间复杂度很糟糕,平均时间复杂度为O(n2)。
那还有没有优化的地方呢?
可以发现,在插入之前,需要定位元素插入的位置,而上面的做法是通过遍历比较来进行定位,时间复杂度相对来说很高,O(n)。
查找步骤可以使用二分查找来进行优化。
![手撕插入排序及其优化(希尔排序)](https://image.cha138.com/20210425/c8d76586a38f43fcbb18ca6d4b1b88ef.jpg)
![手撕插入排序及其优化(希尔排序)](https://image.cha138.com/20210425/1e6aa390ef2f422784d891d1be79dc5e.jpg)
定位元素位置可分为几种情况。
单区间只有一个元素时,只需要判断是否要交换该元素即可。
当区间有两个或两个以上元素时,先与边界值进行判断,如果小于等于最左边元素,最后元素的位置应该是最左边的位置。
如果大于等于最右边的元素,则元素的最终位置不变。
对边界值进行判断后发现不是上面两种情况,则说明元素最终应该插入到区间内。
先对区间进行二分,判断元素在哪边,然后缩小区间,直到区间只剩下两个元素,退出二分循环。
最后元素插入位置为为两个元素的中间。
插入排序的最好时间复杂度是O(n),当数组内没有逆序对时。
插入排序的时间复杂度和逆序对的数量成正比,所以可以通过减少逆序对来实现插入排序的优化。
希尔排序是插入排序的优化,希尔排序也称缩小增量排序,通过增量把数组分为几组,每组都执行插入排序。
增量序列逐渐减小,直到增量为1,同时每次对分组进行排序后,逆序对都逐渐减少,逆序对的减少对下一次分组的插入排序效率有所提高。
![手撕插入排序及其优化(希尔排序)](https://image.cha138.com/20210425/1e6aa390ef2f422784d891d1be79dc5e.jpg)
![手撕插入排序及其优化(希尔排序)](https://image.cha138.com/20210425/7d79cb25782341fe9120b46e1dffa925.jpg)
![手撕插入排序及其优化(希尔排序)](https://image.cha138.com/20210425/c0ff97109ba34ff98dbc9d5b9b639e86.jpg)
![手撕插入排序及其优化(希尔排序)](https://image.cha138.com/20210425/cb31affcfe054912a84ae2817845f5ca.jpg)
希尔排序是第一个突破O(n2)时间复杂度限制的排序算法,其时间复杂度受增量序列影响。
往期推荐
不迷途
![手撕插入排序及其优化(希尔排序)](https://image.cha138.com/20210425/a2e94b77db284cf1ae23062b8526f899.jpg)
关注不迷途
您的关注,是对我最大的认可
喜欢本篇内容顺便点个在看吧
以上是关于手撕插入排序及其优化(希尔排序)的主要内容,如果未能解决你的问题,请参考以下文章