图解希尔排序——希尔排序算法(shell sort)

简介: 图解希尔排序——希尔排序算法(shell sort)

希尔排序又叫缩小增量排序,它是对直接插入排序算法的一种改进。希尔排序算法的基本思想是先将整个待排序的序列划分为若干个子序列,然后分别对子序列排序,逐步缩小划分子序列的间隔,直到划分间隔为1时排序完成。

算法图解

首先给定一个序列[7, 26, 9, 11, 23, 14]

第一趟排序: 按间隔为3划分为三个子序列,对三个子序列分别进行排序,满足从小到大则不动,否则交换两个元素位置。

第二趟排序: 按间隔为2划分子序列,共划分出两个子序列,对两个子序列分别排序

第三趟排序: 按间隔为1划分进行排序

在希尔排序中有一个关键问题就是如何选取划分间隔,一种常用的间隔划分方法是:首先间隔取原始序列长度的一半,在后续排序过程中,后一趟排序的间隔为前一趟排序的间隔的一半。实际上,在业界有一个统一的公式来求划分间隔:gap = gap / 3 + 1。

算法实现(C语言)

void shell_sort(int array[], int len) 
{
  int i = 0, j = 0, k = 0, temp = 0, gap = 0;
  gap = len;
  do
  {
    gap = gap / 3 + 1;
    for(i = gap; i < len; i += gap)
    {
      k = i;
      temp = array[k];
      for(j = i - gap; (j >= 0) && (array[j] > temp); j -= gap)
      {
        array[j + gap] = array[j];
        k = j;
      }
      array[k] = temp;
    }
  }
  while(gap > 1);
}

算法分析

稳定性分析

根据上面的图示可以看出,希尔排序是不稳定的,因为希尔排序是划分子序列对子序列分别排序,如果不同子序列中有相等的数,但它们不在同一子序列中,可能会因为子序列内部排序而改变原有的顺序。比如下图所示,原始序列中有两个11,经过一趟希尔排序后,原本在后面的紫色11跑到了前面位置,所以希尔排序是不稳定的。

复杂度分析

希尔排序并不是简单的随意分组,然后各自排序,希尔排序的精髓在于按照某个增量来划分子序列(最后一个增量必须是1),实现跳跃式移动来提高排序效率,而也正是这种跳跃性带来了不稳定性。

希尔排序的时间复杂度是O(nlogn),希尔排序是最早突破排序算法复杂度O(n×n)的算法之一,从此排序算法时间复杂度不可突破O(n×n)的说法也不攻自破,并且分组划分的思想为后来很多更高效的排序算法提供了思路。

相关文章
|
1月前
|
算法 搜索推荐 Java
数据结构与算法(Java篇)笔记--希尔排序
数据结构与算法(Java篇)笔记--希尔排序
|
3月前
|
Shell 数据安全/隐私保护
shell中的通配符 熟悉grep、cut、sort等小工具和shell中的通配符的使用
shell中的通配符 熟悉grep、cut、sort等小工具和shell中的通配符的使用
34 0
|
13天前
|
人工智能 搜索推荐 Shell
【排序算法】插入排序与希尔排序,你不想知道为什么希尔比插入更快吗?
【排序算法】插入排序与希尔排序,你不想知道为什么希尔比插入更快吗?
|
15天前
|
搜索推荐 算法 Shell
【数据结构与算法】直接插入排序和希尔排序
【数据结构与算法】直接插入排序和希尔排序
|
27天前
|
搜索推荐 算法
【排序算法】一文教你从零学会希尔排序
【排序算法】一文教你从零学会希尔排序
|
1月前
|
搜索推荐 算法 Shell
【Shell 命令集合 文档编辑 】Linux 排序命令 sort命令使用指南
【Shell 命令集合 文档编辑 】Linux 排序命令 sort命令使用指南
29 0
|
1月前
|
存储 算法 JavaScript
【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)(二)
【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)
28 0
|
1月前
|
算法 搜索推荐 程序员
【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)(一)
【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)
33 0
|
1月前
|
搜索推荐 测试技术
排序算法-插入/希尔排序
排序算法-插入/希尔排序
10 0
|
2月前
|
搜索推荐 算法 Java
【数据结构排序算法篇】----希尔排序【实战演练】
【数据结构排序算法篇】----希尔排序【实战演练】
26 2