排序算法之二--希尔排序(属于插入排序中的一种)

本文详细介绍了希尔排序的基本原理、实现过程及时间复杂度分析,并通过示例展示了希尔排序的具体操作步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

希尔排序又称缩小增量排序。


希尔排序是插入排序中的一种:

       希尔排序是在时间复杂度上突破O(N2)的第一个排序,希尔排序也是直接插入排序的一种,因为希尔排序的内部排序是采用直接插入排序来实现的。


希尔排序的原理:

       让元素分组,让其各自排序完整之后,整个序列变得基本有序,就是分成多组,前面一组的元素都小于后面组的元素,最后在对全体元素进行一次直接插入排序。

       具体原理:

              1)将所有元素按照某个法则分成若干子序列,分别对各自子序列进行直接插入排序

              2)依次缩减增量再进行排序,直至增量足够小时,对全体元素进行依次直接插入排序。


以n=12的一个数组为例,增量按照n/2:

第一次增量是6,第一次循环排序

             11     32    43    12     65     2     12   35      35      10      14     13
             1                                                1

                      2                                                2

                              3                                                 3

                                      4                                                   4                               

                                                5                                                   5                   

                                                        6                                                   6

第二次增量是3,第二次循环排序

              11    32    15    10     14     2      12    32     43     12      65      12

              1                      1                        1                        1 

                      2                        2                      2                           2

                              3                       3                         3                          3

依次进行下去。。。。  

这里可以看出两个35的相对位置发生了变化,所以希尔排序是一种不稳定的排序方法


希尔排序c语言实现:

  1. void shellsort3(int a[], int n)  
  2. {  
  3.     int i, j, gap;  
  4.   
  5.     for (gap = n / 2; gap > 0; gap /= 2)             //一个gap长度的元素与下个gap长度的元素进行比较,也可以另一种方法,每个组之间比较,都是可以
  6.         for (i = gap; i < n; i++)  
  7.             for (j = i - gap; j >= 0 && a[j] > a[j + gap]; j -= gap)  
  8.                 Swap(a[j], a[j + gap]);  
  9. }  
          希尔排序还有其他实现的方法,我只是觉得这种方法不错。


算法的时间复杂度:     

        希尔排序的时间复杂度与增量序列的选取有关,例如希尔增量时间复杂度为O(n²),而Hibbard增量的希尔排序的时间复杂度为O(

   
),希尔排序时间复杂度的下界是n*log2n。希尔排序没有 快速排序算法 快 O(n(logn)),因此中等大小规模表现良好,对规模非常大的 数据排序 不是最优选择。但是比O(
   
)复杂度的算法快得多。并且希尔排序非常容易实现,算法代码短而简单。 此外,希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏的情况下执行的效率会非常差。(百度百科)

        也可以采用斐波拉契数列的形式分增量序列


算法的空间复杂度:

       由于内部的排序实质上是插入排序,所以空间复杂度为O(1)



建议:链表形式存储的序列不适合希尔排序


以上仅是个人理解,如果有误,请提出批评指正,交流才能不断地进步!






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值