2019精品第十章 内部排序(2)英语

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
因此,需要对它进行“筛选”。
建堆是一个从下往上进行“筛选”的过程。
例如: 排序之前的关键字序列为
4908
5851
4998
7831
1326
27
94890
875135 64 3162
现在,左/右子树都已经调整为堆,最后 只要调整根结点,使整个二叉树是个“堆” 即可。
堆排序的时间复杂度分析:
1. 对深度为 k 的堆,“筛选”所需进行的关键字 比较的次数至多为2(k-1);
if (j<=n) TR[k..n] = SR[j..n]; // 将剩余的 SR[j..n] 复制到 TR
时间复杂度分析
对 n 个记录进行归并排序的时间复杂度 为Ο(nlogn)。即:
每一趟归并的时间复杂度为 O(n), 总共需进行 log2n 趟。
6、基数排序
基数排序是一种借助“多关键字排序” 的思想来实现“单关键字排序”的内部 排序算法。
2. 较小结点靠近根结 点,但不绝对。
50 40 28
堆的定义:
堆是具有下列性质的完全二叉树:每个结点的值都 小于或等于其左右孩子结点的值(称为小顶堆), 或每个结点的值都大于或等于其左右孩子结点的值 (称为大顶堆)。
1. 大顶堆的根结点是 所有结点的最大者。
2. 较大结点靠近根结 点,但不绝对。
5、归并排序
归并排序的主要操作是归并,其主要思想是: 将若干有序序列逐步归并,最终得到一个有序 序列。
归并:将两个或两个以上的有序序列合并成一个有序 序列的过程。
在内部排序中,通常采用的是2-路归并排序。 即:将两个位置相邻的记录有序子序列
有序子序列 R[l..m] 有序子序列 R[m+1..n]
归 并 排 序 O(nlogn) O(nlogn)
基 数 排 序 O(d(n+rd) O(d(n+rd)
最坏情况 O(n2) O(n2) O(n2) O(n2) O(n2)
O (nlogn) O(nlogn)
O(d(n+rd)
本章小结
1、了解排序的定义和各种排序方法的特点。 2、熟悉各种方法的排序过程及其依据的原则。基
第十章 内部排序(2)
主要内容
1. 概述 2. 插入排序 3. 快速排序 4. 选择排序 5. 归并排序 6. 基数排序 7. 各种内部排序方法比较
4、选择排序
4.1 简 单 选 择 排 序
4.2 堆 排 序
4.1 简 单 选 择 排 序
选择排序的主要操作是选择,其主要思想是: 每趟排序在当前待排序序列中选出关键字最小 的记录,添加到有序序列中。
7、各种内部排序方法比较
时间复杂度比较
排序方法 平均情况 最好情况
直 接 插 入 排 序 O(n2) 希 尔 排 序 O(nlogn) 起 泡 排 序 O(n2) 快 速 排 序 O(nlogn)
O(n) O(n1.3) O (n) O(nlogn)
简 单 选 择 排 序 O(n2)
O(n2)
堆 排 序 O(nlogn) O(nlogn)
6.1 多关键字的排序 6.2 链式基数排序
6.1 多关键字的排序
n 个记录的序列 { R1, R2, …,Rn} 对关键字 (Ki0, Ki1,…,Kid-1) 有序是指: 对于序列中任意两个记录 Ri 和 Rj (1≤i<j≤n) 都满足下列(词典)有序关系: (Ki0, Ki1, …,Kid-1) < (Kj0, Kj1, …,Kjd-1)
于“关键字间的比较”进行排序的方法可以按 排序过程所依据的不同原则分为插入排序、交 换排序、选择排序、归并排序和计数排序等五 类。 3、掌握各种排序方法的时间复杂度的分析方法。 能从“关键字间的比较次数”分析排序算法的 平均情况和最坏情况的时间性能。 重点和难点: 1、各种方法排序过程
作业:12月17日交本
50
38
45
32
36 40 28
20 18 28
判断下列二叉树是否是堆?
12
36
27
65 81 73
40
314
98
55 49
不 是堆
堆排序基本思想:
首先将待排序的记录序列构造成一个堆,此时,选出 了堆中所有记录的最小者,然后将它从堆中移走,并 将剩余的记录再调整成堆,这样又找出了次小的记录, 以此类推,直到堆中只有一个记录。
LSD法先对 Kd-1 进行排序,然后对 Kd-2 进行 排序,依次类推,直至对最主位关键字 K0 排序完 成为止。
例如:学生记录含三个关键字: 系别、班号和班内的序列号,其中以系别为最主 位关键字。
LSD的排序过程如下:
无序序列 3,2,30 1,2,15 3,1,20 2,3,18 2,1,20 对K2排序 1,2,15 2,3,18 3,1,20 2,1,20 3,2,30 对K1排序 3,1,20 2,1,20 1,2,15 3,2,30 2,3,18 对K0排序 1,2,15 2,1,20 2,3,18 3,1,20 3,2,30
归并为一个记录的有序序列。 有 序 序 列 R[l..n]
书P283
void Merge (RcdType SR[], RcdType &TR[],
int i, int m, int n) { // 将有序的记录序列 SR[i..m] 和 SR[m+1..n] // 归并为有序的记录序列 TR[i..n]
(一)
1、给出一组关键字序列{29,18,25,47,58,12,51,10}。 分别写出按下列各种排序方法进行排序时的变 化过程。
(1)归并排序:每归并一次书写一个次序。 (2)快速排序:每划分一次书写一个次序。 2、给出一组关键字
T={12,2,16,30,8,28,4,10,20,6,18},写出用希尔排序 (第一趟排序的增量为5)从小到大排序时第一 趟结束时的序列。
其中: K0 被称为 “最主”位关键字
Kd-1 被称为 “最次”位关键字
实现多关键字排序 通常有两种作法:
最高位优先MSD法
最低位优先LSD法
MSD法先对K0进行排序,并按 K0 的不同值将记 录序列分成若干子序列之后,分别对 K1 进行排 序,...…, 依次类推,直至最后对最次位关键字排 序完成为止。
i 1
2
移动记录的次数,最小值为 0, 最大值为3(n-1) 。
4.2 堆 排 序
堆的定义:
堆是具有下列性质的完全二叉树:每个结点的值都 小于或等于其左右孩子结点的值(称为小顶堆), 或每个结点的值都大于或等于其左右孩子结点的值 (称为大顶堆)。
18
20
32
38
25 36 45
1. 小顶堆的根结点是 所有结点的最小者。
C (16,53,23,94,பைடு நூலகம்1,72) D (16,23,53,31,94,72)
(二)上机(不交) 实验
3、选择题:
(1)对n个不同的数据元素进行冒泡排序,排序 结果要求为从小到大的有序序列。在下列哪种 初始情况下比较的次数最多?( )
A从小到大排列好的 B从大到小排列好的
C元素无序
D元素基本有序
(2)对有n个记录的数据序列作排序,除基数排
序方法外,最坏情况下算法的时间复杂度是什
么?( )
A O(n) B O(n2) C O(nlogn) D O(n3) (3)下列关键字序列中,哪个序列是堆? A (16,72,31,23,94,53) B (94,23,31,72,16,53)
然后按其 “十位数” 取值分别为 0, 1, …, 9 “分 配” 成 10 组,之后再按从 0 至 9 的顺序将它们 “收 集” 在一起;
最后按其“百位数”重复一遍上述操作。 书P287
基数排序的时间复杂度为O(d(n+rd))
其中:分配为O(n) 收集为O(rd)(rd为“基”) d为“分配-收集”的趟数
for (j=m+1, k=i; i<=m && j<=n; ++k)
{
// 将SR中记录由小到大地并入TR
if (SR[i].key<=SR[j].key) TR[k] = SR[i++];
else TR[k] = SR[j++];
}
……
} // Merge
if (i<=m) TR[k..n] = SR[i..m]; // 将剩余的 SR[i..m] 复制到 TR
2. 对 n 个关键字,建成深度为h(=log2n+1)的堆, 所需进行的关键字比较的次数至多 4n;
3. 调整“堆顶” n-1 次,总共进行的关键 字比较的次数不超过
2 (log2(n-1)+ log2(n-2)+ …+log22) < 2n(log2n)
因此,堆排序的时间复杂度为O(nlogn)。
j = SelectMinKey(R, i); // 在 R[i..n] 中选择关键字最小的记录
if (i!=j) R[i]←→R[j]; // 与第 i 个记录交换
} } // SelectSort
时间性能分析
对 n 个记录进行简单选择排序,所需 进行的 关键字间的比较次数 总计为:
n1 (n i) n(n 1)
有序序列
无序序列
r1 r2 r1 r2
…… ……
ri-1 ri … rk … rn 交换 最小记录
ri-1 ri ri+1 … ri … rn
简单选择排序基本思想:第i 趟在n-i+1 (i=1,2,…,n-1)个记录中选取关键字最小的记 录作为有序序列中的第i个记录。
void SelectSort (Elem R[], int n ) { // 对记录序列R[1..n]作简单选择排序。 for (i=1; i<n; ++i) { // 选择第 i 小的记录,并交换到位
6.2 链式基数排序
对于数字型或字符型的单关键字,可以看 成是由多个数位或多个字符构成的多关键字, 此时可以采用这种“分配-收集”的办法进行排 序,称作基数排序法。
例如:对下列这组关键字 {209, 386, 768, 185, 247, 606, 230, 834, 539 }
首先按其 “个位数” 取值分别为 0, 1, …, 9 “分配” 成 10 组,之后按从 0 至 9 的顺序将 它们 “收集” 在一起;
实现堆排序,需要解决两个问题:
1、如何“建堆”? 2、如何“筛选”?
所谓“筛选”指的是,对一棵左/右子

均为堆的完全二叉树,“调整”根结

使整个二叉树也成为筛一个堆。 选


例如:
12
918821
比较
8713
49
7634
36
27
40
55 6142 1928
是大顶堆
但在 98 和 12 进行互换之后,它就不是堆了,
相关文档
最新文档