希尔排序时间复杂度 希尔排序

希尔排序 希尔排序又称 缩小增量排序 ,其也属于插入排序类算法 。相教于一般的插入算法、 折半插入 算法、 2-路插入 算法以及 表插入 算法,希尔排序在时间效率上更加优秀 。
对于普通的插入算法,其时间复杂度为,且在序列有序时,可以达到最好的时间复杂度;而且当较小时,由于移动的元素较少,插入排序效率也比较高 。
因此,我们可以采用 分治 的思想,先将整个待排序序列分割成为若干个子序列分别进行插入排序,待整个序列「基本有序」时再对全体进行插入排序,即自底向上实现整个序列的排序 。
【注】这里的子序列不是简单的逐段分割,而是将相隔某个 增量 的元素组成一个子序列,这样对子序列进行插入排序时,元素就不是一步一步移动,而是跳跃式地往前移 。
其中,数组 D 为增量序列 。常用的增量序列有:
希尔排序是 不稳定的、原址的。不稳定原因在于希尔排序中不同段交换元素时会打乱相等元素初始的相对位置 。
数据结构:希尔排序 希尔排序是基于插入排序的以下两点性质而提出改进方法的:
说说我的个人理解:
希尔排序其实就是直接插入排序的升级,原理就是先将整个待排序列按照某个增量(也称步长)分割成若干个子序列分别进行直接插入排序,然后合并,之后依次缩小增量大小在进行排序,当增量足够小(通常为1)时,再对全体元素进行直接插入排序,而此时需排序的数据几乎是已排好的了,所以此时插入排序较快 。
当然如果你觉得文字比较乏味就看下面的这些例子吧
例如,假设有这样一组数 [9 1 5 8 3 7 4 6 2] ,如果我们先以步长为4进行分割,就是这样:
然后我们对每列进行排序(注意每列哦):
将上述四行数字,依序合并我们得到: [ 2 1 4 6 3 7 5 8 9 ]。此时2已经往前移,而8、9已经在后两位,然后再以2为步长进行分割:
继续排序:
合并得到 [ 2 1 3 6 4 7 5 8 9] ,此时序列已经基本有序,需交换数据的情况大为减少,这时整列进行直接插入排序效率就非常高 。
最终完成排序过程,也就是步长为1时,得到最终序列为: 1 2 3 4 5 6 7 8 9。
可能有几个步骤略难懂,这里解释下:
当时,9和3进行了一次交换,变为 (3 9 2) (位置为1 5 9),之后在时,做出的交换如上图所示(图略差...),分为三个步骤:
步长的选取非常关键,但是步长的选择没有统一规定,也没绝对的规律 。只要满足最后一个步长为1即可 。Donald Shell最初建议步长选择为,虽然这样去可以比类的算法更好,但仍然有减少平均时间和最差时间的余地 。维基百科给出的部分步长与最坏情况下复杂度有:
已知的最好步长序列是由Sedgewick提出的(1, 5, 19, 41, 109,...),该序列的项来自和这两个算式 。这项研究也表明“比较在希尔排序中是最主要的操作,而不是交换 。”用这样步长序列的希尔排序比插入排序要快,甚至在小数组中比快速排序和堆排序(后续博客整理),但是在涉及大量数据时希尔排序还是比快速排序慢 。
希尔排序的详细过程把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序 。随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序 。我们来通过演示图,更深入的理解一下这个过程 。
希尔排列
希尔排序又叫递减增量排序算法,它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的;希尔排序是一种不稳定的排序算法 。希尔排序由唐纳德·希尔(Donald Shell)发明并于1959年公布,因此得名希尔排序 。
希尔算法

希尔排序时间复杂度 希尔排序

文章插图
排序算法-7---希尔排序希尔排序(Shellsort),也称递减增量排序算法,是一种典型的插入排序算法,通过对原始序列进行分组进行排序 。希尔排序是非稳定排序算法 。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
希尔排序的基本思想就是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序 。
矩阵的列数取决于步长序列(step sequence)
比如,如果步长序列为{1,5,19,41,109...}.. 就代表依次分成109列、41列、 19列、 5列、1列进行排序

秒懂生活扩展阅读