数据结构8排序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2011-12-14 13
改进直接插入排序算法
INSERTSORT(DataType R[],int n) i,j; { int i,j; 循环n 循环n-1次 (i=2 i<=n; for (i=2;i<=n;i++) 暂存 R[0 R[i]; { R[0]=R[i]; j=i-1; 比较 (R[0 key<R[j]. while (R[0].key<R[j].key) R[j+1 R[jR[j+1]=R[j- -]; 先后移, 先后移,再j-1 R[j+1 R[0 R[j+1]=R[0]; 插入 } }
2011-12-14 14
R[0]有两个作用 有两个作用: 有两个作用
其一: 是进入查找循环之前, 其一: 是进入查找循环之前,保存 R[i] 的副本,使之 的副本, 不至于因记录的后移而丢失R[i]中的内容; R[i]中的内容 不至于因记录的后移而丢失R[i]中的内容; 其二: 其二 是在 while 循环时,“监视”下标变量 j 是 循环时, 监视” 否越界, 越界(j<1),R[0]自动控制while循环的 自动控制while 否越界,一旦 越界(j<1),R[0]自动控制while循环的 结束, 从而避免了在while 结束, 从而避免了在while 循环内的每一次都要检测 是否越界( 即省略了循环条件j j 是否越界( 即省略了循环条件j > -1)。 因此, 称为“监视哨” 因此,把 R[0] 称为“监视哨”。
直接插入排序的稳定性
直接插入排序是一种稳定的排序方法。 直接插入排序是一种稳定的排序方法。 稳定的排序方法 原理:关键字相同的两个对象,在整个排序过程中, 原理:关键字相同的两个对象,在整个排序过程中, 不会通过比较而相互交换。 不会通过比较而相互交换。
2011-12-14 17
希尔排序
由D.L. Shell提出,又称缩小增量排序,即先小范围排序. Shell提出 又称缩小增量排序,即先小范围排序. 提出, 基本思想: 基本思想: 先将待排序记录序列分割成若干个“较稀疏的”子序列, 先将待排序记录序列分割成若干个“较稀疏的”子序列, 分别进行直接插入排序。经过上述粗略调整, 分别进行直接插入排序。经过上述粗略调整, 整个序列中的记 录已经基本有序,最后再对全部记录进行一次直接插入排序。 录已经基本有序,最后再对全部记录进行一次直接插入排序。 (1) 取一个整数 d1(d1<n 又称增量),将全部 n 个记录分为 又称增量) 若干个组, 倍数的记录放在同一个组中。 若干个组, 将所有距离为 d1 倍数的记录放在同一个组中。 (2) 在每一个组内进行直接插入排序。 在每一个组内进行直接插入排序。 (3) 取d2<d1,重复上述的分组和排序,…..直到最后取di=1 d2<d1,重复上述的分组和排序,…..直到最后取 直到最后取di=1 为止。 为止。 可以看出:希尔排序是分组概念上的直接插入排序. 可以看出:希尔排序是分组概念上的直接插入排序.
排序的时间开销
量。
2011-12-14
它是衡量算法好坏的最重要的标志。 它是衡量算法好坏的最重要的标志。
通常用算法执行中的数据比较次数和数据移动次数来衡 通常用算法执行中的数据比较次数和数据移动次数来衡 数据比较次数
6
为简单起见,数据的存储结构采用记录数组形式, 为简单起见,数据的存储结构采用记录数组形式, 同时假定关键字是整数。记录数组的类型说明如下: 同时假定关键字是整数。记录数组的类型说明如下: Typedef int KeyType typedef struct { KeyType key; key; int other; other; } DataType; DataType; DataType R[n]; R[n]; 其中n 其中n为记录总数
i≠j), 若在排序前的序列中Ri领先于Rj( i<j), Ri领先于Rj(即 i≠j), 若在排序前的序列中Ri领先于Rj(即i<j),经过 排序后得到的序列中Ri仍领先于Rj, 排序后得到的序列中Ri仍领先于Rj, 则称所用的排序方 Ri仍领先于Rj 法是稳定的;反之, 法是稳定的;反之,当相同关键字的领先关系在排序过程 中发生变化,则称所用的排序方法是不稳定的。 中发生变化,则称所用的排序方法是不稳定的。 如:2, 2*,1,排序后若为1, 2*, 2 则该排序方法是 2*,1,排序后若为1, 不稳定的。在应用排序的某些场合,如选举和比赛等,对 不稳定的。在应用排序的某些场合,如选举和比赛等, 排序的稳定性是有特殊要求的。 排序的稳定性是有特殊要求的。
2011-12-14 7
8.2、 8.2、插入排序
基本原理: 基本原理:
在一个已排好序的记录子集的基础上, 在一个已排好序的记录子集的基础上,每一步将 下一个待排序的记录有序地插入到已排好序的记录子 集中,直到将所有待排记录全部插入为止。 集中,直到将所有待排记录全部插入为止。
分类: 分类: 直接插入排序( Sort) 直接插入排序(Insert Sort) 希尔排序( 希尔排序(Shell Sort) Sort)
2011-12-14 11
改进: 改进:
R(1) R(0)
R(2)
R(3) R(4)
R(5) R(6)
i 2 3 4 5 6
21 [21] [21] [21 [21 [21 [21 [21 [21 [16 [16 [ 8
25 25 25] 25] 25 25 21 16
49 49 49 49] 49] 25* 25 21
2011-12-14
15
算法分析
直接插入排序算法由两重循环组成,对于有n个记录的排序, 直接插入排序算法由两重循环组成,对于有n个记录的排序, 内循环表明完成一趟排序所需进行的记录关键字间的比较和 记录的后移。 记录的后移。 最好情来自百度文库:若初始时关键字递增有序。 最好情况:若初始时关键字递增有序。 比较次数: 每一趟排序中仅需进行一次关键字的比较。 比较次数:n-1 每一趟排序中仅需进行一次关键字的比较。 移动次数:2(n-1)。在while循环之前和之中,至少要移动 循环之前和之中, 移动次数:2(n-1)。 while循环之前和之中 记录两次。 记录两次。 最坏情况:若初始时关键字递减有序。 最坏情况:若初始时关键字递减有序。 比较次数最大值:∑(i+1)=(n比较次数最大值:∑(i+1)=(n-1)(n+2)/2 n-1
内排序与外排序 :排序过程是否全部在内存进行。 排序过程是否全部在内存进行。 内存进行
(区分标准) 区分标准)
2011-12-14 5
排序的方法有很多,但简单地判断那一种算法最好, 排序的方法有很多,但简单地判断那一种算法最好,以 便能够普遍选用则是困难的。 便能够普遍选用则是困难的。 评价排序算法好坏的标准主要有两条: 评价排序算法好坏的标准主要有两条: 1.算法执行所需要的时间和所需要的附加空间。 1.算法执行所需要的时间和所需要的附加空间。 算法执行所需要的时间和所需要的附加空间 2.算法本身的复杂程度也是需要考虑的一个因素。 2.算法本身的复杂程度也是需要考虑的一个因素。 算法本身的复杂程度也是需要考虑的一个因素 排序算法所需要的附加空间一般都不大, 排序算法所需要的附加空间一般都不大,矛盾并不突 而排序是一种经常执行的一种运算, 出。而排序是一种经常执行的一种运算,往往属于系统 的核心部分,因此排序的时间开销 时间开销是算法好坏的最重要 的核心部分,因此排序的时间开销是算法好坏的最重要 的标志。 的标志。
2011-12-14
8
直接插入排序( 直接插入排序(Insert Sort) Sort)
基本思想: 基本思想:
R[0]---R[iR[0]---R[i-1] ---R[i
有序区
R[i]---R[nR[i]---R[n-1] ---R[n
无序区
当插入第i个对象时,前面的(R[0],R[1], ,R[i当插入第i个对象时,前面的(R[0],R[1],…,R[i (R[0],R[1], ,R[i1])已经排好序 此时, R[i]的关键字与R[i已经排好序, 的关键字与R[i 1])已经排好序,此时,用R[i]的关键字与R[i-1], R[i-2],…的关键字顺序进行比较 的关键字顺序进行比较, R[i-2], 的关键字顺序进行比较,找到插入位置即将 R[i]插入 原来位置上对象向后顺移。 插入, R[i]插入,原来位置上对象向后顺移。
2011-12-14
9
直接插入排序举例
i (0) temp (1) (2) (3) (4) (5)
21 [21] 21] 25 1 [21 [21 49 2 [21 [21 25* 3 [21 [21 16
2011-12-14
25 25 25] 25] 25 25
49 49 49
25* 16 25* 16 25* 16
i=1 移动次数最大值:∑(i+2)=(n移动次数最大值:∑(i+2)=(n-1)(n+4)/2 n-1 i=1
T(n)=O(n2) T(n)=O(n2)
随机情况:若初始时关键字随机排列。 随机情况:若初始时关键字随机排列。 比较次数的期望值为: 比较次数的期望值为: n2/4 移动次数的期望值为: 移动次数的期望值为: n2/4 原始数据集合越接近有序,直接插入排序的时间效率越高. 原始数据集合越接近有序,直接插入排序的时间效率越高. 其效率: O(n)---O(n 其效率: O(n)---O(n2)
8 8 8 8 8
10
49] 49] 25* 16 25* 49] 49] 16
直接插入排序算法
InsertSort(DataType R[],int n) i,j; { int i,j; temp; DataType temp; (i=0 i<n//nfor (i=0;i<n-1;i++) //n-1次 temp=R[i+1 { temp=R[i+1]; j=i; while(j>temp.key<R[j]. while(j>-1 && temp.key<R[j].key) R[j+1 R[jR[j+1]=R[j- -]; R[j+1 temp; R[j+1]=temp; } }
25* 25* 25* 25* 49] 49] 25* 25
16 16 16 16 16 49] 49] 25*
8 8 8 8 8 8 49] 49]
25 49 25* 16 8
2011-12-14
12
算法步骤: 算法步骤:
设已排序部分(R1,R2...Ri-1), 已排序部分(R1,R2...Ri ...Ri未排序部分(Ri,Ri+1,...Rn), 未排序部分(Ri,Ri+1,...Rn), (1). R0=Ri (2). R0.key与 Rj.key (j=i-1,i-2...)进行比较; R0.key与 (j=i-1,i-2...)进行比较 进行比较; (3).若 (3).若R0 .key < Rj .key, 则Rj后移一位, j--, .key, Rj后移一位 j-后移一位, --, 再执行(2); 再执行(2); (4).若 (4).若R0 .key >=Rj .key, 则将R0插入Rj+1位置, .key, 则将R0插入Rj+1位置, R0插入Rj+1位置 执行(1) 执行(1)
排序(Sorting): 排序(Sorting):
简单地说, 简单地说,排序就是将一组杂乱无章的数据按 一定的规律排列起来(递增或递减)。 一定的规律排列起来(递增或递减)。 排序是计算机中经常遇到的操作。 排序是计算机中经常遇到的操作。
2011-12-14
3
排序的几个基本概念
数据表(Data 数据表(Data List): 待排序的数据对象的有限集合。 待排序的数据对象的有限集合。 关键字(Key): 作为排序依据的数据对象中的属性域。 作为排序依据的数据对象中的属性域。 主关键字 :不同的数据对象若关键字互不相同,则这种 不同的数据对象若关键字互不相同 关键字互不相同,
关键字称为主关键字。
排序的确切定义 : 使一组任意排列的对象变成一组按 使一组任意排列的对象变成一组按
关键字线性有序的对象。 关键字线性有序的对象。 的对象
2011-12-14
4
排序算法的稳定性 :假设Ki=Kj(1≤i≤n,1≤j≤n, 假设Ki=Kj(1≤i≤n 1≤j≤n, Ki=Kj(1≤i≤n,
概述 插入排序 选择排序 交换排序 归并排序 基数排序 比较
2011-12-14 1
总体内容: 总体内容:
排序的概念和有关知识 常用几种排序方法的基本思想、排序过程和 常用几种排序方法的基本思想、 实现算法。 实现算法。 分析各种算法的时间复杂度
2011-12-14
2
8.1、 8.1、排序的概述
改进直接插入排序算法
INSERTSORT(DataType R[],int n) i,j; { int i,j; 循环n 循环n-1次 (i=2 i<=n; for (i=2;i<=n;i++) 暂存 R[0 R[i]; { R[0]=R[i]; j=i-1; 比较 (R[0 key<R[j]. while (R[0].key<R[j].key) R[j+1 R[jR[j+1]=R[j- -]; 先后移, 先后移,再j-1 R[j+1 R[0 R[j+1]=R[0]; 插入 } }
2011-12-14 14
R[0]有两个作用 有两个作用: 有两个作用
其一: 是进入查找循环之前, 其一: 是进入查找循环之前,保存 R[i] 的副本,使之 的副本, 不至于因记录的后移而丢失R[i]中的内容; R[i]中的内容 不至于因记录的后移而丢失R[i]中的内容; 其二: 其二 是在 while 循环时,“监视”下标变量 j 是 循环时, 监视” 否越界, 越界(j<1),R[0]自动控制while循环的 自动控制while 否越界,一旦 越界(j<1),R[0]自动控制while循环的 结束, 从而避免了在while 结束, 从而避免了在while 循环内的每一次都要检测 是否越界( 即省略了循环条件j j 是否越界( 即省略了循环条件j > -1)。 因此, 称为“监视哨” 因此,把 R[0] 称为“监视哨”。
直接插入排序的稳定性
直接插入排序是一种稳定的排序方法。 直接插入排序是一种稳定的排序方法。 稳定的排序方法 原理:关键字相同的两个对象,在整个排序过程中, 原理:关键字相同的两个对象,在整个排序过程中, 不会通过比较而相互交换。 不会通过比较而相互交换。
2011-12-14 17
希尔排序
由D.L. Shell提出,又称缩小增量排序,即先小范围排序. Shell提出 又称缩小增量排序,即先小范围排序. 提出, 基本思想: 基本思想: 先将待排序记录序列分割成若干个“较稀疏的”子序列, 先将待排序记录序列分割成若干个“较稀疏的”子序列, 分别进行直接插入排序。经过上述粗略调整, 分别进行直接插入排序。经过上述粗略调整, 整个序列中的记 录已经基本有序,最后再对全部记录进行一次直接插入排序。 录已经基本有序,最后再对全部记录进行一次直接插入排序。 (1) 取一个整数 d1(d1<n 又称增量),将全部 n 个记录分为 又称增量) 若干个组, 倍数的记录放在同一个组中。 若干个组, 将所有距离为 d1 倍数的记录放在同一个组中。 (2) 在每一个组内进行直接插入排序。 在每一个组内进行直接插入排序。 (3) 取d2<d1,重复上述的分组和排序,…..直到最后取di=1 d2<d1,重复上述的分组和排序,…..直到最后取 直到最后取di=1 为止。 为止。 可以看出:希尔排序是分组概念上的直接插入排序. 可以看出:希尔排序是分组概念上的直接插入排序.
排序的时间开销
量。
2011-12-14
它是衡量算法好坏的最重要的标志。 它是衡量算法好坏的最重要的标志。
通常用算法执行中的数据比较次数和数据移动次数来衡 通常用算法执行中的数据比较次数和数据移动次数来衡 数据比较次数
6
为简单起见,数据的存储结构采用记录数组形式, 为简单起见,数据的存储结构采用记录数组形式, 同时假定关键字是整数。记录数组的类型说明如下: 同时假定关键字是整数。记录数组的类型说明如下: Typedef int KeyType typedef struct { KeyType key; key; int other; other; } DataType; DataType; DataType R[n]; R[n]; 其中n 其中n为记录总数
i≠j), 若在排序前的序列中Ri领先于Rj( i<j), Ri领先于Rj(即 i≠j), 若在排序前的序列中Ri领先于Rj(即i<j),经过 排序后得到的序列中Ri仍领先于Rj, 排序后得到的序列中Ri仍领先于Rj, 则称所用的排序方 Ri仍领先于Rj 法是稳定的;反之, 法是稳定的;反之,当相同关键字的领先关系在排序过程 中发生变化,则称所用的排序方法是不稳定的。 中发生变化,则称所用的排序方法是不稳定的。 如:2, 2*,1,排序后若为1, 2*, 2 则该排序方法是 2*,1,排序后若为1, 不稳定的。在应用排序的某些场合,如选举和比赛等,对 不稳定的。在应用排序的某些场合,如选举和比赛等, 排序的稳定性是有特殊要求的。 排序的稳定性是有特殊要求的。
2011-12-14 7
8.2、 8.2、插入排序
基本原理: 基本原理:
在一个已排好序的记录子集的基础上, 在一个已排好序的记录子集的基础上,每一步将 下一个待排序的记录有序地插入到已排好序的记录子 集中,直到将所有待排记录全部插入为止。 集中,直到将所有待排记录全部插入为止。
分类: 分类: 直接插入排序( Sort) 直接插入排序(Insert Sort) 希尔排序( 希尔排序(Shell Sort) Sort)
2011-12-14 11
改进: 改进:
R(1) R(0)
R(2)
R(3) R(4)
R(5) R(6)
i 2 3 4 5 6
21 [21] [21] [21 [21 [21 [21 [21 [21 [16 [16 [ 8
25 25 25] 25] 25 25 21 16
49 49 49 49] 49] 25* 25 21
2011-12-14
15
算法分析
直接插入排序算法由两重循环组成,对于有n个记录的排序, 直接插入排序算法由两重循环组成,对于有n个记录的排序, 内循环表明完成一趟排序所需进行的记录关键字间的比较和 记录的后移。 记录的后移。 最好情来自百度文库:若初始时关键字递增有序。 最好情况:若初始时关键字递增有序。 比较次数: 每一趟排序中仅需进行一次关键字的比较。 比较次数:n-1 每一趟排序中仅需进行一次关键字的比较。 移动次数:2(n-1)。在while循环之前和之中,至少要移动 循环之前和之中, 移动次数:2(n-1)。 while循环之前和之中 记录两次。 记录两次。 最坏情况:若初始时关键字递减有序。 最坏情况:若初始时关键字递减有序。 比较次数最大值:∑(i+1)=(n比较次数最大值:∑(i+1)=(n-1)(n+2)/2 n-1
内排序与外排序 :排序过程是否全部在内存进行。 排序过程是否全部在内存进行。 内存进行
(区分标准) 区分标准)
2011-12-14 5
排序的方法有很多,但简单地判断那一种算法最好, 排序的方法有很多,但简单地判断那一种算法最好,以 便能够普遍选用则是困难的。 便能够普遍选用则是困难的。 评价排序算法好坏的标准主要有两条: 评价排序算法好坏的标准主要有两条: 1.算法执行所需要的时间和所需要的附加空间。 1.算法执行所需要的时间和所需要的附加空间。 算法执行所需要的时间和所需要的附加空间 2.算法本身的复杂程度也是需要考虑的一个因素。 2.算法本身的复杂程度也是需要考虑的一个因素。 算法本身的复杂程度也是需要考虑的一个因素 排序算法所需要的附加空间一般都不大, 排序算法所需要的附加空间一般都不大,矛盾并不突 而排序是一种经常执行的一种运算, 出。而排序是一种经常执行的一种运算,往往属于系统 的核心部分,因此排序的时间开销 时间开销是算法好坏的最重要 的核心部分,因此排序的时间开销是算法好坏的最重要 的标志。 的标志。
2011-12-14
8
直接插入排序( 直接插入排序(Insert Sort) Sort)
基本思想: 基本思想:
R[0]---R[iR[0]---R[i-1] ---R[i
有序区
R[i]---R[nR[i]---R[n-1] ---R[n
无序区
当插入第i个对象时,前面的(R[0],R[1], ,R[i当插入第i个对象时,前面的(R[0],R[1],…,R[i (R[0],R[1], ,R[i1])已经排好序 此时, R[i]的关键字与R[i已经排好序, 的关键字与R[i 1])已经排好序,此时,用R[i]的关键字与R[i-1], R[i-2],…的关键字顺序进行比较 的关键字顺序进行比较, R[i-2], 的关键字顺序进行比较,找到插入位置即将 R[i]插入 原来位置上对象向后顺移。 插入, R[i]插入,原来位置上对象向后顺移。
2011-12-14
9
直接插入排序举例
i (0) temp (1) (2) (3) (4) (5)
21 [21] 21] 25 1 [21 [21 49 2 [21 [21 25* 3 [21 [21 16
2011-12-14
25 25 25] 25] 25 25
49 49 49
25* 16 25* 16 25* 16
i=1 移动次数最大值:∑(i+2)=(n移动次数最大值:∑(i+2)=(n-1)(n+4)/2 n-1 i=1
T(n)=O(n2) T(n)=O(n2)
随机情况:若初始时关键字随机排列。 随机情况:若初始时关键字随机排列。 比较次数的期望值为: 比较次数的期望值为: n2/4 移动次数的期望值为: 移动次数的期望值为: n2/4 原始数据集合越接近有序,直接插入排序的时间效率越高. 原始数据集合越接近有序,直接插入排序的时间效率越高. 其效率: O(n)---O(n 其效率: O(n)---O(n2)
8 8 8 8 8
10
49] 49] 25* 16 25* 49] 49] 16
直接插入排序算法
InsertSort(DataType R[],int n) i,j; { int i,j; temp; DataType temp; (i=0 i<n//nfor (i=0;i<n-1;i++) //n-1次 temp=R[i+1 { temp=R[i+1]; j=i; while(j>temp.key<R[j]. while(j>-1 && temp.key<R[j].key) R[j+1 R[jR[j+1]=R[j- -]; R[j+1 temp; R[j+1]=temp; } }
25* 25* 25* 25* 49] 49] 25* 25
16 16 16 16 16 49] 49] 25*
8 8 8 8 8 8 49] 49]
25 49 25* 16 8
2011-12-14
12
算法步骤: 算法步骤:
设已排序部分(R1,R2...Ri-1), 已排序部分(R1,R2...Ri ...Ri未排序部分(Ri,Ri+1,...Rn), 未排序部分(Ri,Ri+1,...Rn), (1). R0=Ri (2). R0.key与 Rj.key (j=i-1,i-2...)进行比较; R0.key与 (j=i-1,i-2...)进行比较 进行比较; (3).若 (3).若R0 .key < Rj .key, 则Rj后移一位, j--, .key, Rj后移一位 j-后移一位, --, 再执行(2); 再执行(2); (4).若 (4).若R0 .key >=Rj .key, 则将R0插入Rj+1位置, .key, 则将R0插入Rj+1位置, R0插入Rj+1位置 执行(1) 执行(1)
排序(Sorting): 排序(Sorting):
简单地说, 简单地说,排序就是将一组杂乱无章的数据按 一定的规律排列起来(递增或递减)。 一定的规律排列起来(递增或递减)。 排序是计算机中经常遇到的操作。 排序是计算机中经常遇到的操作。
2011-12-14
3
排序的几个基本概念
数据表(Data 数据表(Data List): 待排序的数据对象的有限集合。 待排序的数据对象的有限集合。 关键字(Key): 作为排序依据的数据对象中的属性域。 作为排序依据的数据对象中的属性域。 主关键字 :不同的数据对象若关键字互不相同,则这种 不同的数据对象若关键字互不相同 关键字互不相同,
关键字称为主关键字。
排序的确切定义 : 使一组任意排列的对象变成一组按 使一组任意排列的对象变成一组按
关键字线性有序的对象。 关键字线性有序的对象。 的对象
2011-12-14
4
排序算法的稳定性 :假设Ki=Kj(1≤i≤n,1≤j≤n, 假设Ki=Kj(1≤i≤n 1≤j≤n, Ki=Kj(1≤i≤n,
概述 插入排序 选择排序 交换排序 归并排序 基数排序 比较
2011-12-14 1
总体内容: 总体内容:
排序的概念和有关知识 常用几种排序方法的基本思想、排序过程和 常用几种排序方法的基本思想、 实现算法。 实现算法。 分析各种算法的时间复杂度
2011-12-14
2
8.1、 8.1、排序的概述