经典希尔排序PPT
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
希尔排序
网工<1>班 刘孝朋
希尔排序是对直接插入排序算法的改进, 其主要思想是:先将整个排序数列分割成 为若干个子序列,在子序列分别进行直接 插入排序,待整个数列基本有序时再对全 部进行一次直接插入排序。以此来形成新 的有序数列。一般分割方法是两个元素相 距d=n/2,n/4,n/8……以此类推
入排序
for (i=d+1; i<n;i++) r[0]=r; //暂存被插入记录 for (j=i-d; j>0 &&r[0]<r[j]; j=j-d) r[j+d]=r[j]; //记录后移d个位置 r[j+d]=r[0];
10
11
5、希尔排序算法分析
(1)时间效率: 研究证明,若增量的选取比较合理,希尔排序的时间
复杂度为O(n(log2n)2)
(2)空间效率:O(1) (3)算法的稳定性:不稳定
12
再见!
13
751,076 129,438 937,863,742,751 694,129 076,937 438 第1趟 256,301,694
dk=5
第 2趟
076 694, 863, 129, 256, 076 ,301 301, ,129 ,256 076, 256 ,438 438, ,694 ,742 742, ,751 751, ,863 ,937 937
算法分析:开始时dk的值较大,子序列中的对象较少,排序速 度较快;随着排序进展,dk 值逐渐变小,子序列中对象 个数逐渐变多,由于前面工作的基础,大多数对象已基 本有序,所以排序速度仍然很快。可以看出,49*排序后 出现在49的前面,故希尔算法是不稳定的。
7
例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) 第2趟 (dk=3) 第3趟 (dk=1) 49 13 13 13 04 38 27 27 04 04 13 49* 65 49* 49* 27 97 55 55 38 38 76 04 27 04 49* 27 13 49 49 49 27 38 38 55 55 49* 65 65 65 55 97 97 97 76 04 76 76 76 97
dk=3
第 3趟
076,129 301,256 129,301 256,438,694,742,751,863,937
dk=1
8
例3.希尔排序的排序过程
65 34 25 87 12 38 56 46 14 77 92 23
结果序列d=6 56
34
14
77
12
23
65
46
25
87
92
38
(a)
56 34 14 77 12 23 65 46 25 87 92 38
2
直接排序
直接插入排序的基本思想:把待排序数列 分成有序区和无序区,初始时有序区为待 排序数列的第一个元素,其余部分作为待 排序元素。然后,讲待排序元素一次一个 地加入有序区,直到结束。这样来形成新 的有序数列。
3
代码和一个实例如下。
void InsertSort(int r[], int n) for (inti=2; i<n; i++) r[0]=r; //设置哨兵 for (j=i-1; r[0]<r[j]; j--) //寻找插入位置 r[j+1]=r[j]; //记录后移 r[j+1]=r[0]; 初始值 12 15 9 20 6 31 24 第一趟排序结果 12 15 9 20 6 31 24 第二趟排序结果 9 12 15 20 6 31 24 第三趟排序结果 9 12 15 20 6 31 24 第四趟排序结果 6 9 12 15 20 31 24 第五趟排序结果 6 9 12 1 5 20 31 24 第六趟排序结果 6 9 12 15 20 24 31
个增量dk的记录组成一个小组,让增量dk逐趟缩短(例如依
次取5,3,1),直到dk=1为止。 3.优点:让关键字值小的元素能很快前移,且序列若基本有序
时,再用直接插入排序处理,时间效率会高很多。
6
例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 初态:
4
在这个程序中一定要注意和明白哨兵的作 用—— 1、它暂存r的值,防止在数列元素移动过程 中丢失 2、防止查询越界
5
希尔(shell)排序 (又称缩小增量排序)
1.基本思想:把整个待排序的数据元素分成若干个小组,对同 一小组内的数据元素用直接插入法排序;小组的个数逐次缩 小,当完成了所有数据元素都在一个组内的排序后排序过程 结束。 2.技巧:小组的构成不是简单地“逐段分割”,而是将相隔某
结果序列d=3 56
12
14
65
34
23 (b)
77
46
25
87
92
38
56
12
Fra Baidu bibliotek
14
65
34
23
77
46
25
87
92
38
结果序列d=1 12
14
23
25
34
38 (c)
46
56
65
77
87
92
9
4.算法如下
void ShellSort(int r[], int n) for (d=n/2; d>=1;d=d/2) //以增量为d进行直接插
网工<1>班 刘孝朋
希尔排序是对直接插入排序算法的改进, 其主要思想是:先将整个排序数列分割成 为若干个子序列,在子序列分别进行直接 插入排序,待整个数列基本有序时再对全 部进行一次直接插入排序。以此来形成新 的有序数列。一般分割方法是两个元素相 距d=n/2,n/4,n/8……以此类推
入排序
for (i=d+1; i<n;i++) r[0]=r; //暂存被插入记录 for (j=i-d; j>0 &&r[0]<r[j]; j=j-d) r[j+d]=r[j]; //记录后移d个位置 r[j+d]=r[0];
10
11
5、希尔排序算法分析
(1)时间效率: 研究证明,若增量的选取比较合理,希尔排序的时间
复杂度为O(n(log2n)2)
(2)空间效率:O(1) (3)算法的稳定性:不稳定
12
再见!
13
751,076 129,438 937,863,742,751 694,129 076,937 438 第1趟 256,301,694
dk=5
第 2趟
076 694, 863, 129, 256, 076 ,301 301, ,129 ,256 076, 256 ,438 438, ,694 ,742 742, ,751 751, ,863 ,937 937
算法分析:开始时dk的值较大,子序列中的对象较少,排序速 度较快;随着排序进展,dk 值逐渐变小,子序列中对象 个数逐渐变多,由于前面工作的基础,大多数对象已基 本有序,所以排序速度仍然很快。可以看出,49*排序后 出现在49的前面,故希尔算法是不稳定的。
7
例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) 第2趟 (dk=3) 第3趟 (dk=1) 49 13 13 13 04 38 27 27 04 04 13 49* 65 49* 49* 27 97 55 55 38 38 76 04 27 04 49* 27 13 49 49 49 27 38 38 55 55 49* 65 65 65 55 97 97 97 76 04 76 76 76 97
dk=3
第 3趟
076,129 301,256 129,301 256,438,694,742,751,863,937
dk=1
8
例3.希尔排序的排序过程
65 34 25 87 12 38 56 46 14 77 92 23
结果序列d=6 56
34
14
77
12
23
65
46
25
87
92
38
(a)
56 34 14 77 12 23 65 46 25 87 92 38
2
直接排序
直接插入排序的基本思想:把待排序数列 分成有序区和无序区,初始时有序区为待 排序数列的第一个元素,其余部分作为待 排序元素。然后,讲待排序元素一次一个 地加入有序区,直到结束。这样来形成新 的有序数列。
3
代码和一个实例如下。
void InsertSort(int r[], int n) for (inti=2; i<n; i++) r[0]=r; //设置哨兵 for (j=i-1; r[0]<r[j]; j--) //寻找插入位置 r[j+1]=r[j]; //记录后移 r[j+1]=r[0]; 初始值 12 15 9 20 6 31 24 第一趟排序结果 12 15 9 20 6 31 24 第二趟排序结果 9 12 15 20 6 31 24 第三趟排序结果 9 12 15 20 6 31 24 第四趟排序结果 6 9 12 15 20 31 24 第五趟排序结果 6 9 12 1 5 20 31 24 第六趟排序结果 6 9 12 15 20 24 31
个增量dk的记录组成一个小组,让增量dk逐趟缩短(例如依
次取5,3,1),直到dk=1为止。 3.优点:让关键字值小的元素能很快前移,且序列若基本有序
时,再用直接插入排序处理,时间效率会高很多。
6
例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 初态:
4
在这个程序中一定要注意和明白哨兵的作 用—— 1、它暂存r的值,防止在数列元素移动过程 中丢失 2、防止查询越界
5
希尔(shell)排序 (又称缩小增量排序)
1.基本思想:把整个待排序的数据元素分成若干个小组,对同 一小组内的数据元素用直接插入法排序;小组的个数逐次缩 小,当完成了所有数据元素都在一个组内的排序后排序过程 结束。 2.技巧:小组的构成不是简单地“逐段分割”,而是将相隔某
结果序列d=3 56
12
14
65
34
23 (b)
77
46
25
87
92
38
56
12
Fra Baidu bibliotek
14
65
34
23
77
46
25
87
92
38
结果序列d=1 12
14
23
25
34
38 (c)
46
56
65
77
87
92
9
4.算法如下
void ShellSort(int r[], int n) for (d=n/2; d>=1;d=d/2) //以增量为d进行直接插