希尔排序(Shell Sort)是最早突破复杂度O(n^2)的排序算法 算法引入 希尔排序(Shell Sort)是Shell提出来的,对插入排序法的改进,也是最早突破复杂度O(n2)的排序算法。 插入排序法有2个特点:
希尔排序提供了一个办法,可以直接比较交换间隔较远的数据 h-sort 希尔排序的关键思想是先用间隔较远的数据相互排序,这样有机会把位置很偏的数据迅速安放到正确的位置。首先我们介绍一个新概念:h-sort 如果一个序列中任何一个间隔为h的子序列都是排好序的,那么这个序列叫做h-sorted 答案: 原序列有5个间隔为5的子序列:
如果上述5个子序列都排好序,那么原来都序列就变成了5-sorted.
想一想:
再想一想: 希尔排序 我们定义一个从大到小的数列叫做步长序列, 只要最终步长为 1 任何步长串行都可以使用。希尔排序就是用步长序列定义的步长对数组用插入排序法反复排序对过程。
算法实现 为什么循环从i=gap开始?, 因为我们对所以子序列用插入排序法进行排序;而在插入排序法中,第一个元素可以看做已经排好序的,这里有gap个子序列,所以前面一共有gap个排好序的元素。 学而时嘻之,不亦乐乎~, 来做个填充练习: 算法复杂度 希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比o(n^2)好一些。 |
|