希尔排序.ppt

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
dk=3
第3趟 076,310219,122596,235061,438,694,742,751,863,937
dk=1
5
希尔排序的算法
template <class T>
void dataList<T> :: ShellSort ( ) {
Element<T> temp;
int gap = CurrentSize / 2; //gap是子序列间隔
1.基本思想:把整个待排序的数据元素分成若干个小组,对同 一小组内的数据元素用直接插入法排序;小组的个数逐次缩 小,当完成了所有数据元素都在一个组内的排序后排序过程 结束。
2.技巧:小组的构成不是简单地“逐段分割”,而是将相隔某 个增量dk的记录组成一个小组,让增量dk逐趟缩短(例如依 次取5,3,1),直到dk=1为止。
希尔排序
希尔排序是对直接插入排序算法的改进, 其主要思想是:先将整个排序数列分割成
为若干个子序列,在子序列分别进行直接 插入排序,待整个数列基本有序时再对全 部进行一次直接插入排序。以此来形成新 的有序数列。一般分割方法是两个元素相 距d=n/2,n/4,n/8……以此类推
2
希尔(shell)排序 (又称缩小增量排序)
Vector[j] = Vector[j-gap];
else break;
Vector[j] = temp;
}
Hale Waihona Puke Baidu
gap = ( int ) ( gap / 2 );
}
}
Gap的取法有多种。最初 shell 提出取 gap = n/2,gap = gap/2,直到gap = 1。knuth 提出取 gap = gap/3 +1。还有人提出都取 奇数为好,也有人提出各 gap 互质为好。
算法分析:开始时dk的值较大,子序列中的对象较少,排序速 度较快;随着排序进展,dk 值逐渐变小,子序列中对象 个数逐渐变多,由于前面工作的基础,大多数对象已基 本有序,所以排序速度仍然很快。可以看出,49*排序后 出现在49的前面,故希尔算法是不稳定的。
4
例2:以关键字序列(256,301,751,129,937,863,742, 694,076,438)为例,写出执行希尔排序(取dk=5,3,1)算 法的各趟排序结束时,关键字序列的状态。 原始序列:256,301,751,129,937,863,742,694,076, 438
第1趟 (dk=5)
4193 3287 4695* 9575 7064 1439 2378 4695* 5957 0746
第2趟 (dk=3) 第3趟 (dk=1)
13 2074 49* 5358 0247 49 3585 65 97 76 1034 0143 4297* 38 4297* 49 55 65 9776 7967
5、希尔排序算法分析 (1)时间效率: 研究证明,若增量的选取比较合理,希尔排序的时间 复杂度为O(n(log2n)2) (2)空间效率:O(1) (3)算法的稳定性:不稳定
8
3.优点:让关键字值小的元素能很快前移,且序列若基本有序 时,再用直接插入排序处理,时间效率会高很多。
3
例1:关键字序列 T=(49,38,65,97, 76, 13, 27, 49*,55,
04),请写出希尔排序的具体实现过程。
r[i]
0 1 2 3 4 5 6 7 8 9 10
初态:
49 38 65 97 76 13 27 49* 55 04
while ( gap != 0 ) {
//循环,直到gap为零
for ( int i = gap; i < CurrentSize; i++) {
temp = Vector[i]; //直接插入排序
for ( int j = i; j >= gap; j -= gap )
if ( temp < Vector[j-gap] )
第1趟 256,301,765914,102796,94378,863,742,679541,017269,49387
dk=5
第2趟 20057766, ,330011, ,619249,,02275566,,443388,,866934,,774422, ,775511, ,182693, ,993377
相关文档
最新文档