vlambda博客
学习文章列表

手撕插入排序及其优化(希尔排序)

点击蓝字

关注不迷途


插入排序,遍历未排序元素,插入到有序的数组内。


手撕插入排序及其优化(希尔排序)


手撕插入排序及其优化(希尔排序)


插入排序的实现很简单,但是时间复杂度很糟糕,平均时间复杂度为O(n2)。


那还有没有优化的地方呢?


可以发现,在插入之前,需要定位元素插入的位置,而上面的做法是通过遍历比较来进行定位,时间复杂度相对来说很高,O(n)。


查找步骤可以使用二分查找来进行优化。


手撕插入排序及其优化(希尔排序)


手撕插入排序及其优化(希尔排序)


定位元素位置可分为几种情况。


单区间只有一个元素时,只需要判断是否要交换该元素即可。


当区间有两个或两个以上元素时,先与边界值进行判断,如果小于等于最左边元素,最后元素的位置应该是最左边的位置。


如果大于等于最右边的元素,则元素的最终位置不变。


对边界值进行判断后发现不是上面两种情况,则说明元素最终应该插入到区间内。


先对区间进行二分,判断元素在哪边,然后缩小区间,直到区间只剩下两个元素,退出二分循环。


最后元素插入位置为为两个元素的中间。


插入排序的最好时间复杂度是O(n),当数组内没有逆序对时。


插入排序的时间复杂度和逆序对的数量成正比,所以可以通过减少逆序对来实现插入排序的优化。


希尔排序是插入排序的优化,希尔排序也称缩小增量排序,通过增量把数组分为几组,每组都执行插入排序。


增量序列逐渐减小,直到增量为1,同时每次对分组进行排序后,逆序对都逐渐减少,逆序对的减少对下一次分组的插入排序效率有所提高。


手撕插入排序及其优化(希尔排序)


手撕插入排序及其优化(希尔排序)


手撕插入排序及其优化(希尔排序)


手撕插入排序及其优化(希尔排序)


希尔排序是第一个突破O(n2)时间复杂度限制的排序算法,其时间复杂度受增量序列影响。


往期推荐



不迷途

手撕插入排序及其优化(希尔排序)

关注不迷途

您的关注,是对我最大的认可


喜欢本篇内容顺便点个在看吧