希尔排序

希尔排序算法

  一、基本思想:分组增量插入方法,先取定一个小于 n 的整数 d1 作为第一个增量,把表的全部记录分成 d1 个组,所有间距为 d1 的倍数的记录放置在同一个组,再在各组内进行直接插入排序,依次类推,直至所取的增量 di=1,即将所有的记录都放置在同一个组中进行直接插入排序为止。

  

  技术分享

 

  二、C 语言代码:

  

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 //取 di = n/2, di+1 = di/2
 5 void shellSort(SqList R[], int n)
 6 {
 7     int i; 
 8     int j; 
 9     int gap; 
10     SqList tmp; 
11     gap = n/2; //为增量设置初值 
12     
13     //对所有相隔 gap 位置的所有元素组采用直接插入排序 
14     while (gap > 0) { 
15         for (i = gap; i < n; i++) { 
16             tmp = R[i]; 
17             j = i - gap; 
18             while (j >= 0 && tmp.key < R[j].key) { 
19                 R[j+gap] = R[j]; 
20                 j = j - gap; 
21             } 
22             R[j+gap] = tmp; 
23         } 
24         gap = gap/2; //减少增量 
25     } 
26 } 

  

  三、算法分析

    希尔排序算法的性能分析是一个复杂的问题,因为增量的选取不是一个定值,假若按照本文所述,di = n/2, di+1 = di/2,即后一个增量是前一个增量的 1/2,经过 T=log2(n-1) 次增量后,di=1。

    时间复杂度:希尔排序的算法的时间复杂度难以分析,一般认为是 O(n1.3)。

    空间复杂度:由算法代码可知,所需的额外空间只有一个 tmp 变量,故希尔排序算法空间复杂度为 O(1)。

 

  四、思考

    希尔排序算法与直接插入排序算法的原理和思想是一致的,那么,为什么希尔排序算法的性能要优于直接插入排序?

 

 

 

 
 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。