数据结构第十章
数据结构第10章

算法评价(参考)
时间复杂度
若待排序记录按关键字从小到大排列(正序) 关键字比较次数: 记录移动次数:0 若待排序记录按关键字从大到小排列(逆序)
1 n 1
i 2
n
(n 2)(n 1) 2 i 2 n (n 4)(n 1) 记录移动次数: (i 1) 2 i 2
时间复杂度:O(nlogn)
10.3 快速排序分析
快速排序在最好情形下(左、右子区间的长度
大致相等),则结点数n与二叉树深度h应满足 log2n<h<log2n+1,所以总的比较次数不会超 过(n+1)log2n。因此,快速排序的最好时间复 杂度应为O(nlog2n)。理论上已经证明,快速 排序的平均时间复杂度也为O(nlog2n)。 在最坏情况下(逆序或正序),时间复杂度为 O(n2) 空间复杂度:O(logn)
10.3 交换排序 冒泡排序 排序过程
将第一个记录的关键字与第二个记录的关
键字进行比较,若为逆序r[1].key>r[2].key, 则交换;然后比较第二个记录与第三个记 录;依次类推,直至第n-1个记录和第n个 记录比较为止——第一趟冒泡排序,结果 关键字最大的记录被安置在最后一个记录 上 对前n-1个记录进行第二趟冒泡排序,结果 使关键字次大的记录被安置在第n-1个记录 位置 重复上述过程,直到“在一趟排序过程中 没有进行过交换记录的操作”为止
假设含 n 个记录的序列为 { R1 ,R2 ,…,Rn } 其相应的关键字序列为 { K1,K2,…,Kn } 需确定1,2,…,n的一种排列 p1,p2,…,pn 使关键字满足非递减(或非递增)关系 Kp1≤Kp2≤…≤Kpn 即使初始的的序列成为一个按关键字有序的 序列 { Rp1,Rp2,…,Rpn} 这样一种操作称为排序。
数据结构-第十章-内部排序

0
1
2
3
4
5
6
7
8
i=5
MAXINT 49 2 3
MAXINT 49 6 3 MAXINT 49 6 3 MAXINT 49 6 8
38 1
38 1 38 1 38 1
65 97 5 0
65 5 65 5 65 5 97 0 97 0 97 0
76 4
76 4 76 4 76 4
13
27
49
i=6
最坏情况下,待排记录按关键字非递增有序 排列(逆序)时,第 i 趟时第 i+1 个对象 必须与前面 i 个对象都做排序码比较, 并且 每做1次比较就要做1次数据移动。总比较 次 数 为 (n+2)(n-1)/2 次 , 总 移 动 次 数 为 (n+4)(n-1)/2。 在平均情况下的排序码比较次数和对象移 动次数约为 n2/4。因此,直接插入排序的 时间复杂度为 O(n2)。 直接插入排序是一种稳定的排序方法。
折半插入排序 (Binary Insertsort)
基本思想 既然每个要插入记录之前的纪录 已经按关键字有序排列,在查找插入位 臵时就没有必要逐个关键字比较,可以 使用折半查找来实现。由此进行的插入 排序称之为折半插入排序。
折半插入排序的算法
void BInsertSort (SqList &L){ for (i=2;i<=L.length;++i){ L.r[0]=L.r[i]; low=1;high=i-1; //查找范围由1到i-1 while(low<=high){ m=(low+high)/2; if LT(L.r[0].key,L.r[m].key) high=m-1; else low=m+1; }//while 折半查找 for (j=i-1;j>=high+1;--j) L.r[j+1]=L.r[j]; //折半查找结束后high+1位臵即为插入位臵 L.r[high+1]=L.r[0]; }//for }//BInsertSort
数据结构(第10章)

17
10.2.3表插入排序 (直接插入排序应用于用静态链表存储的排序表) 直接插入排序、折半插入排序均要大量移动记录,时间
开销大。若不移动记录完成排序,需要改变存储结构,进行 表插入排序。
表插入排序:用单链表做排序表的存储结构,通过改变 链接指针,实现关键码有序的过程。
0
12
34
5
6
7
8
MAXINT
49
38
65
97
76
13
27
49
(a)
6
8
1
5
0
4
7
2
3
0
12
34
5
6
7
8
MAXINT 13
27
38
49
49
65
76
97
(b)
1
2
3
4
5
6
7
8
0
23
重排记录方法:按链表顺序扫描各结点,将逻辑上的第i 个数据元素调整到数组的第i个分量上。
问题:调整前的第i个纪录可能在数组的第j个分量上,
[ 10 18 20 36 60 ] 25 30 18 12 56
其中,前5个记录组成的子序列是有序的,这时要将第6 个记录插入到前5个记录组成的有序子序列中去,得到一个含 有6个记录的新有序序列。完成这个插入首先需要找到插入位 置:20<25<36,因此25应插入到记录20和记录36之间,从 而得到以下新序列:
与顺序存储的排序表所不同的是:直接插入排序要移动 记录,而表插入排序是修改链接指针。
18
数据结构第十章

第十章 内部排序
主要讨论的问题:几个基本概念;插入类排序;交换 类排序;选择类排序;归并排序;基数排序. .几个基本概念 .排序:将一个记录的任意序列重新排列成一个 按关键字有序的序列. .稳定排序:若待排序的记录中存在两个或两个以 上的主关键字相等的记录,排序前的序列中Ri在Rj 的前面,若在排序后Ri仍在Rj的前面,则称所用的排 序方法是稳定的,否则,称所用的排序方法是不稳 定的.
16
21
最小者 16 交换25,16
i=2
08
16
49
25*
25
最小者 21 21 交换49,21
28
i=3
08 0
16
1
21 2
25* 3 25*
25 4 25
最小者 25* 49 无交换
5
i=4
08
16
21
最小者 25 49 无交换
结果
08
16
21
25*
25
49
各趟排序后的结果
29
i =1时选择排序的过程
21 0
25 1
49 2
25* 3
16
4
08 5
21 0
25 1
49 2
25* 3
16 4
08 5
25 temp
i=2
21
25
49
25*
16
49 08
0
1
2
3
4
5
temp
6
i=3
21 0
25 1
49 2
25* 3
16
4
08 5
25*
i=4
21 0
数据结构第10章

蔡之华主讲
6 24
第一次排序:
{5
7
64}
89
6
24
第二次排序:
{5
7
89
6
24
第三次排序:
{5
7
64
89}
6
24
第四次排序:
ቤተ መጻሕፍቲ ባይዱ{5
6
7
64
89}
24
第五次排序:
{5
6
7
24
64
89}
直接插入排序过程
计算机学院 蔡之华主讲 2.希尔(shell)排序(又称缩小增量排序)
(1)基本思想:把整个待排序的数据元素分成若干个小组,对同
计算机学院
蔡之华主讲
第10章 排序
主 要 知 识 点
排序的基本概念 插入排序 选择排序 交换排序归并排序 基数排序 性能比较
计算机学院
蔡之华主讲
10.1 排序的基本概念
排序是对数据元素序列建立某种有序排列的过程,是把一个数 据元素序列整理成按关键字递增(或递减)排列的过程。 关键字是要排序的数据元素集合中的一个域,排序是以关键字 为基准进行的。 主关键字:数据元素值不同时该关键字的值也一定不同,是能 够惟一区分各个不同数据元素的关键字;不满足主关键字定义 的关键字称为次关键字。 内部排序是把待排数据元素全部调入内存中进行的排序。 外部排序是因数量太大,把数据元素分批导入内存,排好序后 再分批导出到磁盘和磁带外存介质上的排序方法。
for(m = 0; m < numOfD; m++) //共numOfD次循环 { span = d[m]; //取本次的增量值 for(k = 0; k < span; k++) //共span个小组 { //组内是直接插入排序,区别是每次不是增1而是增span for(i = k; i < n-span; i = i+span) { temp = a[i+span]; j = i; while(j > -1 && temp.key <= a[j].key) { a[j+span] = a[j]; j = j-span; } a[j+span] = temp; } } } }
数据结构第10章

e.g: 将序列 49、38、65、97、76、13、27、49 用 起泡 排序的方法进行排序。
0 1 2 3 4 5 6 7 8
49
49
38
65 65
97
76 76
13
27 27
49
38
97
13
49
15
算法描述
void bubble_sort(int a[],int n) change=Ture {for(i=n- 1;i>=1&&change;--i) 算法评价 {change=False; 时间复杂度 for(j=0;j<I;++j) if(a[j]>a[j+1] 最好情况(正序) {a[j] ←→ a[j+1];change=True}}} 比较次数:n-1 移动次数:0 最坏情况(逆序) 比较次数: 移动次数:
}∥for
}∥StrInsSort1
算法评价
若待排序记录按关键字从小到大排列(正序) 最好的情况 关键字比较次数: 记录移动次数: 0 若待排序记录按关键字从大 到小排列(逆序) 最坏的情况 关键字比较次数: 记录移动次数: 若待排序记录是随机的,取平均值 关键字比较次数: 记录移动次数:
T(n)=O(n² )
42 70 85 ) 20
42 70 85 ) 20 j 42 70 85 ) 20 42 70 85 ) 20
i=8 20 (6 s i=8 20 (6 s i=8 20 (6
i=8 20 (6
i=8 20 (6
42 70 85 ) 20
42 70 85 )
13 20 30 39
算法描述
Status BInsertSort ( SqList &L ) { for ( i = 2; i <= L.length ; ++i ) { L.r[0] = L.r[i]; low = 1 ; high = i-1 ; while ( low <= high )
数据结构严蔚敏版第十章答案
数据结构严蔚敏版第十章答案第十章:图一、概述图是一种非常重要的数据结构,它由节点(顶点)和边组成,用于描述事物之间的关系。
在本章中,我们将学习图的基本概念、表示方法和常用算法。
二、基本概念1. 顶点(节点):图中的一个元素,用于表示一个实体,如人、地点等。
2. 边:连接两个顶点的关系,可以是有向的(箭头指向一个方向)或无向的(没有箭头)。
3. 路径:由一系列顶点和边组成的序列,表示从一个顶点到另一个顶点的通路。
4. 无环图:不存在回路(从一个顶点出发,经过若干边又回到该顶点)的图。
5. 有环图:存在回路的图。
三、表示方法1. 邻接矩阵:使用二维数组来表示图的连接关系,数组的行和列分别对应图中的顶点,数组元素表示边的权重或连接状态。
2. 邻接表:使用链表来表示图的连接关系,每个顶点对应一个链表,链表中存储与该顶点相连的其他顶点。
四、图的遍历1. 深度优先搜索(DFS):从一个顶点开始,沿着一条路径尽可能深入地访问顶点,直到无法继续为止,然后回溯到上一个顶点,继续访问其他路径。
使用栈来实现。
2. 广度优先搜索(BFS):从一个顶点开始,先访问其所有相邻顶点,然后再访问相邻顶点的相邻顶点,以此类推,直到所有顶点都被访问到。
使用队列来实现。
五、最小生成树最小生成树是指在一个连通图中,选择其中的一些边,使得这些边构成一棵树,并且树上所有边的权重之和最小。
常用的算法有Prim算法和Kruskal算法。
六、最短路径最短路径是指从一个顶点到另一个顶点的路径中,路径上所有边的权重之和最小。
常用的算法有Dijkstra算法和Floyd算法。
七、拓扑排序拓扑排序是对有向无环图进行排序的一种算法。
它将图中的顶点按照一定的顺序排列,使得所有的有向边都从前面的顶点指向后面的顶点。
八、关键路径关键路径是指在一个有向无环图中,从开始顶点到结束顶点的最长路径。
关键路径上的活动不能延误,否则将影响整个工程的进度。
九、其他图算法除了上述提到的算法,还有许多其他的图算法,如最大流问题、二分图匹配等。
数据结构 chapter10
Department of Computer Science & Technology, Nanjing University
fall
DATA STRUCTURES
多级索引结构形成 m 路搜索树
Department of Computer Science & Technology, Nanjing University
第10章 文件组织、索引结构
文件组织 动态索引结构
Department of Computer Science & Technology, Nanjing University Data Structure
fall
10.1 文件组织
DATA STRUCTURES
文件的基本概念
什么是文件 文件是存储在外存上的数据结构。 文件分操作系统文件和数据库文件
是指向子树的指针,0 i n < m;Ki 是关键码, 1 i n < m。 Ki < Ki+1, 1 i < n。
▪ 在子树 Pi 中所有的关键码都小于 Ki+1,且大于 Ki, 0 < i < n。
▪ 在子树 Pn 中所有的关键码都大于Kn; ▪ 在子树 P0 中的所有关键码都小于 K1。 ▪ 子树 Pi 也是 m 路搜索树,0 i n。
Department of Computer Science & Technology, Nanjing University
fall
DATA STRUCTURES
索引表用于指示逻辑记录与物理记录间的对应关 系,它是按关键码有序的表。
索引顺序文件:主文件也按关键码有序。此时 可对主文件分组,一组记录对应一个索引项。 称这种索引表为稀疏索引。
数据结构chapter_10
typedef struct { //定义每个记录 数据元素) 定义每个记录( //定义每个记录(数据元素)的结构 KeyType key ; //关键字 //关键字 InfoType otherinfo; //其它数据项 //其它数据项 }RedType; //记录类型 //记录类型 typedef struct { //定义顺序表 定义顺序表L //定义顺序表L的结构 RecordType r [ MAXSIZE +1 ]; //存储顺序表的向量 //存储顺序表的向量 //r[0] r[0]一般作哨兵或缓冲区 //r[0]一般作哨兵或缓冲区 int length ; //顺序表的长度 //顺序表的长度 }SqList; //顺序表类型 //顺序表类型
void BInsertSort (SqList &L) {
// 对顺序表 作折半插入排序 对顺序表L作折半插入排序 for ( i=2; i<=L.length; ++i ) { L.r[0] = L.r[i]; // 将L.r[i]暂存到 暂存到L.r[0] 暂存到 low = 1; high = i-1; while (low<=high) { // 在r[low..high]中折半查找有序插入的位置 中折半查找有序插入的位置 m = (low+high)/2; // 折半 if (L.r[0].key < L.r[m].key) high = m-1; // 插入点在低半区 else low = m+1; // 插入点在高半区 } // while for ( j=i-1; j>=low; --j ) L.r[j+1] = L.r[j]; // 记录后移 // 插入 L.r[high+1] = L.r[0]; } } // BInsertSort
数据结构课件 第10章
数 据 结 构 第10章 内部排序10.1 概述•什么是排序?–排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。
–若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。
10.1 概述•待排序的数据类型#define MAXSIZE 1000 // 待排顺序表最大长度typedef int KeyType; // 关键字类型为整数类型typedef struct { KeyType key; // 关键字项 InfoType otherinfo; // 其它数据项} RcdType; //记录类型typedef struct { RcdType r[MAXSIZE+1]; // r[0]闲置或用作哨兵单元 int length; // 顺序表长度} SqList; // 顺序表类型#define MAXSIZE 1000 // 待排顺序表最大长度typedef int KeyType; // 关键字类型为整数类型typedef struct { KeyType key; // 关键字项 InfoType otherinfo; // 其它数据项} RcdType; //记录类型typedef struct { RcdType r[MAXSIZE+1]; // r[0]闲置或用作哨兵单元 int length; // 顺序表长度} SqList; // 顺序表类型10.1 概述•内部排序的类别–插入类:将无序子序列中的一个或几个记录“插入”到有序序列中,从而增加记录的有序子序列的长度。
–交换类:通过“交换”无序序列中的记录从而得到其中关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列的长度。
–选择类:从记录的无序子序列中“选择”关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列的长度。
–归并类:通过“归并”两个或两个以上的记录有序子序列,逐步增加记录有序序列的长度。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
的记录随着d的减小而趋于有序。当增量减小到1时,已达
到基本有序,再进行直接排序,排序就完成了。 在希尔排序中关键字较小的记录不是一步一步的前移, 而是跳跃式的前移,因此效率提高。
四、希尔排序(Shell)
10.2
2. 算法
插 入 排 序
(1)按距离d将待排序数组r 分成若干个小组,等距
离者在同一个组中,初始距离为d1; (2)在每个小组中进行直接插入排序;
二、直接排序概述
10.2 插 入 排 序
3.算法描述 void InsertSort(Sqlist &L) { for(i=2;i<=L.length;++i) {L.r[0]=L.r[i]; //设置哨兵
for(j=i-1;L.r[0].key<L.r[j].key;--j) L.r[j+1]=L.r[j]; //记录后移
第十章
10.1
内部排序
概 述
10.2
10.3 10.4 10.5 10.6 10.7
插入排序
快速排序 选择排序 归并排序 基数排序 各种排序方法的比较
10.1
概
述
一、排序的定义
二、一些排序的术语
一、排序的定义
10.1
概
述
排序是计算机程序设计中的一种重要操作,它的功能是 将一个数据元素(或记录)的任意序列,重新排列成一个按关键 字有序的序列。排序的目的之一是方便数据查找。 对排序下一个确切的定义: 假设含n个记录的序列为:{R1,R2,…,Rn} 其相应的关键字序列为:{K1,K2,…,Kn} 需确定1,2,…,n的一种排列p1 ,p2 ,…,pn ,使其相 应的关键字满足如下的非递减(或非递增)关系: Kp1≤Kp2≤…≤Kpn 使{R1,R2,…,Rn}成为关键字有序的序列: {Rp1,Rp2,…,Rpn} 这种操作称为排序。
四、希尔排序(Shell)
10.2 插 入 排 序
5.算法分析
(1)稳定性
希尔算法是不稳定的排序方法。 (2)时间复杂度
希尔排序算法的速度是所取的“增量”序列的函数, 不论选择什么样的d,最后一个值必须是1。实验表明,希 尔排序的时间复杂度为O(nlog2n)。
(3)空间复杂度 为O(1)。
10.3
三、折半插入排序
10.2 插 入 排 序
3.算法分析
(1)稳定性
折半排序是稳定的排序方法。 (2)算法效率 时间复杂度仍为O(n2)。 空间复杂度为O(1),附加存储空间同直接插入排序。
四、希尔排序(Shell)
10.2 插 入 排 序
又称“缩小增量排序”,属于插入排序类的方法,但在
时间效率上较前几种排序方法有较大的改进。
二、一些排序的术语
10.1 概 述
2. 内部排序和外部排序 内部排序——如果在排序过程中,只使用计算机的 内存存放待排序所有记录,称这种排序为内部排序。(或 对内存中的记录进行的排序)。
外部排序——如果待排序的文件较大,排序期间文 件的全部记录不能同时存放在计算机的内存里,要借助 计算机的外存才能完成排序,称之为“外部排序”。 在外部排序过程中,记录必须在计算机的内存和外 存之间移动。这样,内外存之间的数据交换次数就成为 影响外部排序速度的主要因素。
L.r[j+1]=L.r[0];
} }
//插入到正确位置
二、直接排序概述
10.2 插 入 排 序
例1 直接插入排序的过程。
初始关键字:
(49)
38
49) 49 49 49 38 27
65
65 65) 65 65 49 38
97
97 97 97) 76 65 49
76
76 76 76 97) 76 65
13
13 13 13 13 97) 76
27
27 27 27 27 27 97)
49
49 49 49 49 49 49
i=2: (38) (38 i=3: (65) (38 i=4: (97) (38 i=5: (76) (38 i=6: (13) (13 i=7: (27) (13
i=8: (49) (13
四、希尔排序(Shell)
10.2 插 入 排 序
4.算法描述 void shellsort(Sqlist &L,int dlta[],int t) {//按增量序列dlta[0…t-1] 对顺序表L作希尔排序 for(k=0;k<t;++k) ShellInsert(L,dlta[k]); } void ShellInsert(&L,&dk) {for(i=dk+1;i<=L.length;++i) //增量是dk而不是1 if (l.r[i].key<L.r[i-dk].key) {L.r[0]=L.r[i]; for(j=i-dk;j>0&& (L.r[0].key<L.r[j].key);j-=dk) L.r[j+dk]=L.r[j]; L.r[j+dk]=L.r[0]; } }
(3)修改距离,选一个小于上次距离d1的距离d2;
(4)重复(1)、(2)和(3),直到d=1为止。
四、希尔排序(Shell)
10.2 插 入 排 序
3. 举例 例2 初始关键字: 49 38 65 97 76 13 27 49 55 04 第一次: d1=n/2=5 分成5组:{49,13},{38,27},{65,49},{97,55},{76,04} 各组排序后: 13 27 49 55 04 49 38 65 97 76 第二次: d2=d1/2=3 分成3组:{13,55,38,76},{27,04,65},{49,49,97} 排序后: 13 04 49 38 27 49 55 65 97 76 第三次: d3=2 分成2组:{13,49,27,55,97},{04,38,49,65,76} 排序后:13 04 27 38 49 49 55 65 97 76 第四次: d =1 04 13 27 38 49 49 55 65 76 97
27
38
49
49
65
76
97)
二、直接排序概述
10.2 插 入 排 序
4. 算法分析 (1)稳定性 直接插入排序是稳定的排序方法。 (2)算法效率
a.时间复杂度
时间复杂度为O(n2)。 b.空间复杂度 它只需要一个记录的辅助空间,O(1)。
三、折半插入排序
10.2 插 入 排 序
从减少“比较”和“移动”两种操作的次数考虑,
1.基本思想 在直接插入排序中,当n较小时,排序的效率比较高。 希尔排序方法是先将待排序记录分割成为若干子序列, 分别在子序列中进行直接插入排序,待整个序列中的记录
“基本有序”时,再对全体记录进行一次直接排序。
四、希尔排序(Shell)
10.2 插 入 排 序
子序的分割不是简单的“逐段分割”,而是将待排序 的记录按照某个增量d分成若干子序列,将相隔d的记录组 成一个子序列。在子序列中进行直接插入排序。随着增量 d的逐步变小,各子序列中的记录逐渐增多,各子序列中
折半插入排序是直接插入排序的一种改进方法。
1.折半插入排序思想 由于插入排序的基本操作是在有序表中进行查找和 插入,在有序表中用折半查找方法可以提高查找效率, 利用折半查找的方法来进行插入排序可以减少比较次数, 从而提高整个算法的执行效率。
三、折半插入排序
10.2 插 入 排 序
2.算法描述 void BInsertSort(Sqlist &L) { for(i=2;i<=L.length;++i) {L.r[0]=L.r[i]; //将L.r[i]暂存到L.r[0] low=1;high=i-1; while(low<=high) {m=(low+high)/2; if(L.r[0].key<L.r[m].key) high=m-1; else low=m+1; } for(j=i-1;j>=high+1;--j) L.r[j+1]=L.r[j]; //记录后移 L.r[high+1]=L.r[00.1 概 述
1. 排序方法的稳定与不稳定
在排序过程中,有若干记录的关键字相等,即 Ki=Kj(1≤i≤n,1 1≤j≤n,i≠j) ,在排序前后,含相等 关键字的记录的相对位置保持不变,即排序前Ri在Rj之前, 排序后Ri仍在Rj之前,称这种排序方法是稳定的;
反之,若可能使排序后的序列中Ri在Rj之后,称所用排 序方法是不稳定的。
10.2 插 入 排 序
直接插入排序是一种最简单的排序方法。它的基本操 作是将一个记录插入到已排好序的有序表中,从而得到一 个新的、记录数增1的有序表。 1.排序思想 2.算法 将序列中的第1个记录看成是一个有序的子序列; 从第2个记录起逐个进行插入,直至整个序列变成按关键 字非递减有序序列为止。整个排序过程为进行n-1趟插入。 同时后移记录。
一、插入排序概述
10.2 插 入 排 序
(3)基本操作步骤 a.首先从无序区中取一个记录,通常是第一个记录; b.然后将其同有序区中的元素比较,并按其关键字值大 小,把该记录插入到有序区中的适当位置,这样有序区 中始终保持有序性; c.再从无序区中取一个记录,重复b.操作,直到终态。
二、直接排序概述
快速排序
一、冒泡排序
二、快速排序
一、冒泡排序
10.3 快 速 排 序
1.基本思想: 从 第 一 个 记 录 开 始 , 两 两 记 录 比 较 , 若 L.r[1]>L.r[2],则将两个记录交换;依次类推,L.r[i] 与L[i+1]比较,直至第n-1个记录和第n个记录的关键字进 行比较完毕。 第1趟比较结果将序列中关键字最大的记录放置到最后 一个位置,称为“沉底”,而最小的则上浮一个位置,如 水泡在水中上浮,且n个记录比较n-1次。 第i 趟比较,将L.r[1]到L.r[n-i+1]依次比较相邻两 个记录的关键字,并在“逆序”时交换相邻记录,结果ni+1个记录中关键字最大的记录放置到n-i+1位置上。 n个记录的整个排序过程需进行n-1趟冒泡排序。