希尔排序
希尔排序算法
一、基本思想:分组增量插入方法,先取定一个小于 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)。
四、思考
希尔排序算法与直接插入排序算法的原理和思想是一致的,那么,为什么希尔排序算法的性能要优于直接插入排序?
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。