数据结构第23讲_插入排序2和交换排序_C
数据结构(C语言版清华大学出版社)-章课后部分答案

第八章选择题1. C2.A3.B4.C5.D6.B7.B8.A9.D 10.D 11.C 12.C填空题1.n、n+12. 43.8.25( 折半查找所在块 )4.左子树、右子树5.266.顺序、(n+1)/2、O(log2n)7.m-1、[m/2]-18.直接定址应用题1.进行折半查找时,判定树是唯一的,折半查找过程是走了一条从根节点到末端节点的路径,所以其最大查找长度为判定树深度[log2n]+1.其平均查找长度约为[log2n+1]-1.在二叉排序树上查找时,其最大查找长度也是与二叉树的深度相关,但是含有n个节点的二叉排序树不是唯一的,当对n个元素的有序序列构造一棵二叉排序树时,得到的二叉排序树的深度也为n,在该二叉树上查找就演变成顺序查找,此时的最大查找长度为n;在随机情况下二叉排序树的平均查找长度为1+4log2n。
因此就查找效率而言,二分查找的效率优于二叉排序树查找,但是二叉排序树便于插入和删除,在该方面性能更优。
3. 评价哈希函数优劣的因素有:能否将关键字均匀的映射到哈希表中,有无好的处理冲突的方法,哈希函数的计算是否简单等。
冲突的概念:若两个不同的关键字Ki和Kj,其对应的哈希地址Hash(Ki) =Hash(Kj),则称为地址冲突,称Ki和K,j为同义词。
(1)开放定址法(2)重哈希法(3)链接地址法4.(1)构造的二叉排序树,如图(2)中序遍历结果如下:10 12 15 20 24 28 30 35 46 50 55 68(4)平均查找长度如下:ASLsucc = (1x1+2x2+3x3+4x3+5x3)/12 = 41/128.哈希地址如下:H(35) = 35%11 = 2H(67) = 67%11 = 1H(42) = 42%11 = 9H(21) = 21%11 = 10H(29) = 29%11 = 7H(86) = 86%11 = 9H(95) = 95%11 = 7H(47) = 47%11 = 3H(50) = 50%11 = 6H(36) = 36%11 = 3H(91) = 91%11 = 3第九章选择题1. D2.C3.B4.D5.C6.B7.A8.A9.D 10.D填空题1.插入排序、交换排序、选择排序、归并排序2.移动(或者交换)3.归并排序、快速排序、堆排序4.保存当前要插入的记录,可以省去在查找插入位置时的对是否出界的判断5.O(n)、O(log2n)6.直接插入排序或者改进了的冒泡排序、快速排序7.Log2n、n8.完全二叉树、n/29.1510.{12 38 25 35 50 74 63 90}应用题11.(1)Shell排序(步长为5 3 1)每趟的排序结果初始序列为100 87 52 61 27 170 37 45 61 118 14 88 32步长为5的排序14 37 32 61 27 100 87 45 61 118 170 88 52步长为3的排序结果14 27 32 52 37 61 61 45 88 87 170 100 118步长为1的排序结果14 27 32 37 45 52 61 61 87 88 100 118最后结果14 27 32 37 45 52 61 61 87 88 100 118 170(2)快速排序每趟的排序结果如图初始序列100 87 52 61 27 170 37 45 61 118 14 88 32第一趟排序[32 87 52 61 27 88 37 45 61 14]100[118 170]第二趟排序[14 27]32[61 52 88 37 45 61 87]100 118[170]第三趟排序14[27]32[45 52 37]61[88 61 87]100 118[170]第四趟排序14[27]32[37]45[52]61[87 61]88 100 118[170]第五趟排序14[27]32[37]45[52]61[87 61]88 100 118[170]最后结果14[27]32[37]45[52]61[61]87 88 100 118[170](3)二路归并排序每趟的排序结果初始序列[100][87][52][61][27][170][37][45][61][118][14][88][32]第一趟归并[87 100][52 61][27 170][37 45][61 118][14 88][32]第二趟归并[52 61 87 100][27 37 45 170][14 61 88 118][32]第三趟归并排序[27 37 45 52 61 87 100 170][14 32 61 88 118]第四趟归并排序[14 27 32 37 45 52 61 61 87 88 100 118 170]最后结果14 27 32 37 45 52 61 61 87 88 100 118 17012.采用快速排序时,第一趟排序过程中的数据移动如图:算法设计题1.分析:为讨论方便,待排序记录的定义为(后面各算法都采用此定义):#define MAXSIZE 100 /* 顺序表的最大长度,假定顺序表的长度为100 */ typedef int KeyType; /* 假定关键字类型为整数类型 */typedef struct {KeyType key; /* 关键字项 */OtherType other; /* 其他项 */}DataType; /* 数据元素类型 */typedef struct {DataType R[MAXSIZE+1]; /* R[0]闲置或者充当哨站 */int length; /* 顺序表长度 */}sqList; /* 顺序表类型 */设n个整数存储在R[1..n]中,因为前n-2个元素有序,若采用直接插入算法,共要比较和移动n-2次,如果最后两个元素做一个批处理,那么比较次数和移动次数将大大减小。
C++各类排序算法介绍PPT课件

}
r[i]=x;
qksort(r,t,j-1);
2021/2/10
qksort(r,j+1,w);
21
}
– 算法评价 • 时间复杂度 – 最好情况(每次总是选到中间值作枢轴) T(n)=O(nlog2n) – 最坏情况(每次总是选到最小或最大元素 作枢轴)T(n)=O(n² )
T(n)=O(n²)
• 根据“寻找”插入位置的方法不同,插入法可分为:直 插排序、二分插入排序、希尔排序。
• (1) 直接插入排序
– 若将一个未排序的元素L[i]插入到已排序的具有i-1个 元素的序列的适当位置,步骤如下:
• a. 从右向左顺序搜索已排序的序列,若已排序序 列中的元素比L[i]大,则后移一个位置,直至找到 一个元素L[j-1](0≤j-1≤i-1)的关键字值比L[i]的关键 字值小;
• 希尔排序可提高排序速度,因为 – 分组后n值减小,n² 更小,而T(n)=O(n² ),所 以T(n)从总体上看是减小了 – 关键字较小的记录跳跃式前移,在进行最后一 趟增量为1的插入排序时,序列已基本有序
• 增量序列取法 – 无除1以外的公因子 – 最后一个增量值必须为1
2021/2/10
14
关键字小,则可分别对这两部分记录进行排序,以达到 整个序列有序。 关键字通常取第一个记录的值为基准值。
– 排序过程:对r[s……t]中记录进行一趟快速排序,附设两 个指针i和j,设基准值记录rp=r[s],x=rp.key
• 初始时令i=s,j=t
• 首先从j所指位置向前搜索第一个关键字小于x的记录, 并和rp交换
9.3 交换排序
• (0) 基本思想:
– 两两比较待排序的数据元素的关键字,如果发生逆序, 则交换之,直到全部对象都排好序为止。
国开电大数据结构(本)形考4

标准答案1:以顺序存储方式,且数据元素有序
标准答案2:(n+1)/2
标准答案3:29/10
标准答案4:5
标准答案5:37,24,12,30,53,45,96
标准答案6:4
标准答案7:直接选择排序
标准答案8:插入排序
标准答案9:归并排序
标准答案10:交换排序
标准答案11:快速排序
标准答案12:40,20,30,38,46,56,79,84,90,110
标准答案13:3
标准答案14:5
标准答案15:选择
标准答案16:18,20,25,59,26,36
标准答案17:16,25,35,48,23,40,79,82,36,72 标准答案18:28,16,34,54,62,73,60,26,43,95 标准答案19:40,38,46,56,79,84
标准答案20:39,46,41,57,80,47
标准答案21:{NULL} {k} {p=p->left} {p=p->right} {p}
标准答案22:{n} {(s+j)/2} {j=m-1} {s=m+1} {a[k+1]}
标准答案23:子问题1:C; 子问题2:B
标准答案24:子问题1:B; 子问题2:A
标准答案25:子问题1:C; 子问题2:D
标准答案26:子问题1:D; 子问题2:A
标准答案27:子问题1:C; 子问题2:D。
《数据结构排序》课件

根据实际需求选择时间复杂度和空间 复杂度最优的排序算法,例如快速排 序在平均情况下具有较好的性能,但 最坏情况下其时间复杂度为O(n^2)。
排序算法的适用场景问题
适用场景考虑因素
选择排序算法时需要考虑实际应 用场景的特点,如数据量大小、 数据类型、是否需要稳定排序等 因素。
不同场景适用不同
算法
例如,对于小规模数据,插入排 序可能更合适;对于大规模数据 ,快速排序或归并排序可能更优 。
排序的算法复杂度
时间复杂度
衡量排序算法执行时间随数据量增长而增长的速率。时间复杂度越低,算法效 率越高。常见的时间复杂度有O(n^2)、O(nlogn)、O(n)等。
空间复杂度
衡量排序算法所需额外空间的大小。空间复杂度越低,算法所需额外空间越少 。常见的空间复杂度有O(1)、O(logn)、O(n)等。
在数据库查询中,经常需要对结果进行排序,以便用户能够快速找到所需信息。排序算 法的效率直接影响到查询的响应时间。
索引与排序
数据库索引能够提高查询效率,但同时也需要考虑到排序的需求。合理地设计索引结构 ,可以加速排序操作。
搜索引擎中的排序
相关性排序
搜索引擎的核心功能是根据用户输入的 关键词,返回最相关的网页。排序算法 需要综合考虑网页内容、关键词密度、 链接关系等因素。
VS
广告与排序
搜索引擎中的广告通常会根据关键词的竞 价和相关性进行排序,以达到最佳的广告 效果。
程序中的排序应用
数组排序
在程序中处理数组时,经常需要对其进行排 序。不同的排序算法适用于不同类型的数据 和场景,如快速排序、归并排序等。
数据可视化中的排序
在数据可视化中,需要对数据进行排序以生 成图表。例如,柱状图、饼图等都需要对数 据进行排序处理。
数据结构之排序算法

65
865
姓名
学号
成绩
班级 机97.6
李红 9761059 95
3
第二章 数据结构与算法 (续 )
2016/2/25
4
2.8 排
2.8.1 概 述
序
1、排序的功能:将一个数据元素(或记录)的任意 序列,重新排成一个按关键字有序的序列。
2、排序过程的组成步骤:
• 首先比较两个关键字的大小;
• 然后将记录从一个位置移动到另一个位置。
36
n=8, int(n/2)=4开始 25 41 11 65 49 36 11 56
25 41 65
78 (b): 78被筛选后的状态 11 25 49 78 36 56 65 41 49
56 36
78
78
2016/2/25 (d): 56 被筛选后的状态
(c): 49被筛选后的状态
(e): 被筛选之后建成堆
2016/2/25
假设待排序的记录存放在地址连续的 一组存储单元中,那么这种存储方式 下的数据类型可描述为:
5
#define MAX 20 typedef struct { int key; float otherinfo;
0 1 2 3 4
key info
MAX
}RedType;
… … …
2016/2/25
举例,图8-2-2
2016/2/25
2、折半插入排序
11
折半插入排序在寻找插入位置时,不是逐个比较而是利用折半 查找的原理寻找插入位置。待排序元素越多,改进效果越明显。
例:有6个记录,前5 个已排序的基础上,对第6个记录排序。 [ 15 27 36 53 69 ] 42
数据结构(c言版)课件_第八章_排序_(严蔚敏、吴伟民编_清华大学出版社)

算法描述
算法评价
时间复杂度
记录移动次数
最好情况:0
最坏情况:3(n-1)
比较次数: n1 (n i) 1 (n2 n)
i 1
2
T(n)=O(n²)
空间复杂度:S(n)=O(1)
Ch8_6.c
堆排序
堆的定义:n个元素的序列(k1,k2,……kn),当且仅当 满足下列关系时,称之为堆
增量序列取法 无除1以外的公因子 最后一个增量值必须为1
8.2 交换排序
冒泡排序
排序过程
将第一个记录的关键字与第二个记录的关键字进行比较,若 为逆序r[1].key>r[2].key,则交换;然后比较第二个记录与第 三个记录;依次类推,直至第n-1个记录和第n个记录比较为 止——第一趟冒泡排序,结果关键字最大的记录被安置在最 后一个记录上
二趟排序:13 4 48 38 27 49 55 65 97 76
Ch8_3.c
希尔排序特点
子序列的构成不是简单的“逐段分割”,而是将相隔某个增 量的记录组成一个子序列
希尔排序可提高排序速度,因为 分组后n值减小,n²更小,而T(n)=O(n²),所以T(n)从总体 上看是减小了
关键字较小的记录跳跃式前移,在进行最后一趟增量为1 的插入排序时,序列已基本有序
9776
7163
6257 13
4390 27
3308
38
9173 76
7267 13
6350 27
49 30
49
927 13
7360 27
65 30
65
9370 76
2977 30 76
3初0 9第7 第 第 第 第 第 始一二三四五六 关趟趟趟趟趟趟 键 字
数据结构(C语言版CHAP10

分组方法:选定一增量d,将间隔为d的记录作为一组 例 待排记录 49 38 65 97 76 13 27 49 55 04 d=5 d=3 49 13 13 13 04 38 27 27 04 13 65 49 49 49 27 97 55 55 38 38 76 04 04 27 49 13 27 49 49 38 65 49 38 65 49 55 65 49 55 65 55 97 97 97 76 04 76 76 76 97
10.1
概 述
排序也是数据处理中经常使用的一种操作.例 高考考生信息管理 系统提供了将考生按总分排序,按单科排序的功能; 1 排序定义 设R1 R2 R3 … Rn 是n个记录,k1,k2, k3 … kn为它们的关键字,排序 就是将记录按关键字递增(或递减)的次序排列起来. 2 分类 按记录的存放位置分类有 内排序:待排记录放在内存 外排序:待排记录放在外存 按排序原则分类(内排序) 插入排序 交换排7,76,13,27,49 是待排序列
稳性排序的应用: 例 股票交易系统 考虑一种股票交易(清华紫光)) 1)顾客输入:股东帐号,股票代码,申购价格,数量,股票交易系统 将用户申购请求插入申购队列队尾; 2)股票交易系统按如下原则交易: A)申购价高者先成交 B)申购价相同者按申购时间先后顺序成交 结束 第 5 页
76 38 49 65 97 76 13 27 49
L.r[5]复制为哨兵 0 1 2 3 4 5 6 7 8 9
76 38 49 65 97 97 13 27 49
L.r[0].key < L.r[4].key, L.r[4]记录后移 L.r[0].key≥ L.r[3].key 找到插入位置 插入! 0 1 2 3 4 5 6 7 8 9
《数据结构排序》PPT课件

讨论:若记录是链表结构,用直接插入排序行否?折半插入 排序呢?
答:直接插入不仅可行,而且还无需移动元素,时间效率更 高!但链表无法“折半”!
折半插入排序的改进——2-路插入排序见教材P267。 (1)基本思想: P267 (2)举 例:P268 图10.2 (3)算法分析:移动记录的次数约为n2/8
13 20 39 39 42 70 85
i=8
0
1
2
3
4
5
6
7
8
Hj
折半插入排序的算法分析 • 折半查找比顺序查找快,所以折半插入排序
就平均性能来说比直接插入排序要快。
• 在插入第 i 个对象时,需要经过 log2i +1
次关键码比较,才能确定它应插入的位置。 • 折半插入排序是一个稳定的排序方法。
for ( j=i-1;j>=high+1;--j) L.r [j+1] = L.r [j];// 记录
后移
L.r [high+1] = L.r [0];
// 插入
} // for
} // BInsertSort
初始
30 13 70 85 39 42 6 20
012345678
i=2 13
30
13
数逐渐变多,由于前面工作的基础,大多数对象已基本有 序,所以排序速度仍然很快。
时间效率: O(n1.25)~O(1.6n1.25)——经验公式
空间效率:O(1)——因为仅占用1个缓冲单元 算法的稳定性:不稳定——因为49*排序后却到了49的前面
希尔排序算法(主程序)
参见教材P272
void ShellSort(SqList &L,int dlta[ ],int t){
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
25 56 49 78 11 65 41 36
初 始 状 态
25 56 49 78 11 78 11 65 65 78 41 78 36 36
第 一 趟
25 49 56 56 11 65 41 41 65 36
25 49 49 11 56 41 56 36 36
25 25 11 11 49 49 41 49 41 36 36
3)具体做法 首先将静态链表中数组下标为“1” 的分量 首先将静态链表中数组下标为“ (结点)和表头结点构成一个循环链表,然后 结点)和表头结点构成一个循环链表, 依次将下标为“ 至 的分量( 依次将下标为“2”至“n”的分量(结点)按记 的分量 结点) 录关键字非递减有序插入到循环链表中。 录关键字非递减有序插入到循环链表中。
2.快速排序 2.快速排序
背景 起泡排序的过程可见, 起泡排序的过程可见,起泡排序是一个增加 有序序列长度的过程, 有序序列长度的过程,也是一个缩小无序序列长 度的过程,每经过一趟起泡,无序序列的长度只 度的过程,每经过一趟起泡, 缩小 1。 试设想:若能在经过一趟排序, 试设想:若能在经过一趟排序,使无序序列 的长度缩小一半,则必能加快排序的速度。 的长度缩小一半,则必能加快排序的速度。
5 76 4 5 76 4 5 76 4
0 i=7 MAXINT 6 0 i=8 MAXINT 6
6 13
7 2
6 13 7
7 27 2
4)表插入排序性能分析 从表插入排序的过程可见, 从表插入排序的过程可见,表插入排序的基 本操作仍是将一个记录插入到已排好序的有序表 当中。和直接插排序相比,不同之处仅是以修改 当中。和直接插排序相比,不同之处仅是以修改 2n次指针值代替移动记录,排序过程中所需进行 2n次指针值代替移动记录, 次指针值代替移动记录 的关键字间的比较次数相同。因此表插入排序的 的关键字间的比较次数相同。因此表插入排序的 比较次数相同 时间复杂度仍是O(n 时间复杂度仍是O(n2)。
void ShellSort (SqList &L, int dlta[ ], int t) { 按增量序列dlta[ ..t dlta[0 对顺序表L // 按增量序列dlta[0..t-1]对顺序表L作希尔排序 (k=0 k<t; for (k=0; k<t; ++k) ShellInsert( L, dlta[k]); dlta[k]); ShellInsert( 一趟增量为dlta[k] dlta[k]的插入排序 // 一趟增量为dlta[k]的插入排序 } // ShellSort
flag=0 //开始时元素未交换 flag=0; //开始时元素未交换 j=2 j<=i; for (int j=2; j<=i; j++) if (R[j]<R[j-1]) { (R[j]<R[jtemp=R[j]; temp=R[j]; flag=1 flag=1; } if(flag==0 return; if(flag==0) return; } } // Bubblesort //发生逆序 //发生逆序
初始 状态
0 MAXINT 1 0
1 49 0 1 49 0 1 49
3 0
2 38 2 38
1 -
3 65 3 65 3
65 65 0 -
4 97 4 97 4 97 4
97 97 0 -
5 76 5 76 5 76 5 76 -
6 13 6 13 6 13 6 13 -
7 27 7 27 7 27 7 27 -
逆序: 逆序:
需要进行n 趟排序, 需要进行n(n )/2 次比较, n(n需要进行 n-1 趟排序 , 需要进行 n(n-1)/2 次比较 , 并 作等数量级的记录移动。总的时间复杂度为O(n 作等数量级的记录移动。总的时间复杂度为O(n2) 。
稳定的 适合于数据较少 数据较少的 起泡排序方法是稳定 起泡排序方法是 稳定 的 。 适合于 数据较少 的 情况。 情况。
3)希尔排序算法分析
希尔排序的时间复杂度较直接插入排序低。 希尔排序的时间复杂度较直接插入排序低。希尔排 序的分析是一个复杂的问题,因为它的时间是和所取 序的分析是一个复杂的问题,因为它的时间是和所取 “增量”序列的函数密切相关。到目前为止,还没有求 增量”序列的函数密切相关。到目前为止, 得一种最好的增量序列,但有大量的局部结论。 得一种最好的增量序列,但有大量的局部结论。 注意:应使增量序列中的值没有除1之外的公因子, 注意:应使增量序列中的值没有除1之外的公因子, 并且最后一个增量值必须等于1 并且最后一个增量值必须等于1。
1)基本思想 通过一趟排序将待排序列以枢轴为标准划分 通过一趟排序将待排序列以枢轴为标准划分 枢轴 成两部分,使其中一部分记录的关键字均比另一 两部分, 部分小,再分别对这两部分进行快速排序, 部分小,再分别对这两部分进行快速排序,以达 到整个序列有序。 到整个序列有序。 通常取第一个记录的值为基准值或枢轴。 通常取第一个记录的值为基准值或枢轴。
具体做法: 具体做法: 第一趟: 第一趟:第1个与第2个比较,大则交换;第2个与第3个 个与第2个比较,大则交换; 个与第3 比较,大则交换, 比较,大则交换,… 关键字最大的记录交换 到最后一个位置上; 到最后一个位置上; 第二趟:对前n 个记录进行同样的操作, 第二趟:对前n-1个记录进行同样的操作,关键字次大 的记录交换到第n 个位置上; 的记录交换到第n-1个位置上; 依次类推,则完成排序。 依次类推,则完成排序。
2)待排记录序列的存储结构
#define MAXSIZE 100 Typedef struct{ RcdType next; int next; } SLNode; SLNode; rc; rc; //记录项 //记录项 //指针项 //指针项 //静态链表容量 //静态链表容量
//表结点类型 //表结点类型
R[j]=R[jR[j- ]=temp; R[j]=R[j-1]; R[j-1]=temp;
3)起泡排序算法分析 正序: 正序:
只需进行一趟排序, 在排序过程中进行n 只需进行一趟排序 , 在排序过程中进行 n-1 次关键字 间的比较,且不移动记录;时间复杂度为O(n) 间的比较,且不移动记录;时间复杂度为O(n) 。
3
1 65
2 49
3 97
4 25
5 25
6 13
增量 3
希 尔 排 序 过 程
2
1 25
2 25
3 13
4 65
5 49
6 97
增量 2
1
1 13 1 13
2 25 2 25
3 25 3 25
4 65 4 49
5 49 5 65
6 97 6 97
增量 1
2)希尔排序算法描述
void ShellInsert ( SqList &L, int dk ) { //一趟希尔插入排序。本算法对直接插入算法作了以下修改: //一趟希尔插入排序。本算法对直接插入算法作了以下修改: 一趟希尔插入排序 //1 前后记录位置的增量是dk,而不是1 //1.前后记录位置的增量是dk,而不是1; dk //2 //2.L.r[0]只是暂存单元,不是哨兵。当j<=0时,插入位置已找到 r[0 只是暂存单元,不是哨兵。 j<=0 i=dk+1 i<=L.length; for ( i=dk+1; i<=L.length; ++i ) if ( L.r[i].key< L.r[i-dk].key) {//将R[i]插入有序增量子表 r[i]. r[i-dk]. //将R[i]插入有序增量子表 r[i]; 暂存在R[ R[0 L.r[0] = L.r[i]; // 暂存在R[0] r[0 (j=i-dk; j>0 (L.r[0 r[j].key); for (j=i-dk; j>0 && (L.r[0].key< L.r[j].key);j -= dk) r[j]; 记录后移, L.r[j+dk] = L.r[j]; // 记录后移,查找插入位置 r[0 L.r[j+dk] = L.r[0]; // 插入 } }//ShellInsert
2)具体做法 附设两个指针low和high, 附设两个指针low和high,初值分别指向第 low 一个记录和最后一个记录, key; 一个记录和最后一个记录,设枢轴为 key; (1)从 所指位置起向前搜索, (1)从high 所指位置起向前搜索,找到第一 个不大于基准值的记录与枢轴记录相互交换; 个不大于基准值的记录与枢轴记录相互交换; (2)从low 所指位置起向后搜索,找到第一 (2)从 所指位置起向后搜索, 个不小于基准值的记录与枢轴记录相互交换。 个不小于基准值的记录与枢轴记录相互交换。 (3)重复这两步直至low=high为止。 (3)重复这两步直至low=high为止。 重复这两步直至low=high为止
第10章 10章
10.1 排序的基本概念 10.2 插入排序 10.3 交换排序 10.4 选择排序 10.5 归并排序 10.6 基数排序
内部排序
10.7 各种内部排序方法的比较
10.3 交换排序
1. 起泡排序 2. 快速排序
1.起泡排序 1.起泡排序
1)起泡排序的基本思想 小的浮起, 小的浮起,大的沉底
1)基本思想 又称为“缩小增量排序” 又称为“缩小增量排序” 。先将整个待排 元素序列分割成若干个子序列(由相隔某个“ 元素序列分割成若干个子序列(由相隔某个“增 量”的元素组成的)分别进行直接插入排序,待 的元素组成的)分别进行直接插入排序, 整个序列中的元素基本有序(增量足够小) 整个序列中的元素基本有序(增量足够小)时, 再对全体元素进行一次直接插入排序( 再对全体元素进行一次直接插入排序(接近最好 情况,效率很高), ),因此希尔排序在时间效率上 情况,效率很高),因此希尔排序在时间效率上 比前两种方法有较大提高。 比前两种方法有较大提高。