发布时间:2025-06-24 18:12:55 作者:北方职教升学中心 阅读量:429
下面是希尔排序时间复杂度的估算:
外层循环:
外层循环的时间复杂度可以直接给出为:O ( l o g 2 n ) O(log_2n) O(log2n)或者 O ( l o g 3 n ) O(log_3 n) O(log3n),即O ( l o g n ) O(logn) O(logn)
内层循环:
假设一共有n个数据,合计gap组,则每组为n/gap个;在每组中,插入移动的次数最坏的情况下为
1 + 2 + 3 + . . . . + ( n g a p − 1 ) 1 + 2 + 3 + .... + ({nover gap} - 1) 1+2+3+....+(gapn−1),一共是gap组,因此:
总计最坏情况下移动总数为:g a p ∗ [ 1 + 2 + 3 + . . . . + ( n g a p − 1 ) ] gap∗[1 + 2 + 3 + .... + ({n over gap} - 1)] gap∗[1+2+3+....+(gapn−1)]
gap取值有(以除3为例):n/3 n/9 n/27 … 2 1
当gap为n/3时,移动总数为:n 3 ∗ ( 1 + 2 ) = n {n over 3}*(1+2)=n 3n∗(1+2)=n
当gap为n/9时,移动总数为:n 9 ∗ ( 1 + 2 + 3 + . . . . + 8 ) = n 9 ∗ 8 ( 1 + 8 ) 2 = 4 n {n over 9}*(1+2+3+....+8)={n over 9}*{8(1+8) over 2}=4n 9n∗(1+2+3+....+8)=9n∗28(1+8)=4n
最后一躺,gap=1即直接插入排序,内层循环排序消耗为n
通过以上的分析,可以画出这样的图:
因此,希尔排序在最初和最后的排序的次数都为n,即前一阶段排序次数是逐渐上升的状态,当到达某一顶点时,排序次数逐渐下降至n,而该顶点的计算暂时无法给出具体的计算过程
希尔排序时间复杂度不好计算,因为gap的取值很多,导致很难去计算,因此很多书中给出的希尔排序的时间复杂度都不固定。这样整体而言,可以达到优化的效果。是第一个突破O ( n 2 ) O(n^2) O(n2)的排序算法,它与插入排序的不同之处在于,它会优先比较距离较远的元素。
也可以点点关注,避免以后找不到我哦!
Crossoads主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!
带你初步了解排序算法:https://blog.csdn.net/2301_80191662/article/details/142211265
直接插入排序:https://blog.csdn.net/2301_80191662/article/details/142300973
希尔排序:https://blog.csdn.net/2301_80191662/article/details/142302553
直接选择排序:https://blog.csdn.net/2301_80191662/article/details/142312028
堆排序:https://blog.csdn.net/2301_80191662/article/details/142312338
冒泡排序:https://blog.csdn.net/2301_80191662/article/details/142324131
快速排序:https://blog.csdn.net/2301_80191662/article/details/142324307
归并排序:https://blog.csdn.net/2301_80191662/article/details/142350640
计数排序:https://blog.csdn.net/2301_80191662/article/details/142350741
桶排序:https://blog.csdn.net/2301_80191662/article/details/142375338
基数排序:https://blog.csdn.net/2301_80191662/article/details/142375592
十大经典排序算法总结与分析:https://blog.csdn.net/2301_80191662/article/details/142211564