第10章内部排序[1]PPT课件
合集下载
第10章 内排序
if (L.r[0].key < L.r[m].key) high = m-1; // 插入点在低半区
else low = m+1; // 插入点在高半区
}
10.2 插入排序
其他插入排序
•2-路插入排序 是在折半插入排序的基础上改进得到的。其目的 是减少排序过程中移动的记录次数,但为此需要n个记 录的辅助空间。(见P267)
else if(L.r[i].key>d[final].key) { /* 待插记录大于d中最大值,插到d[final]之后(不需移动d 数组的元素) */ final=final+1; d[final]=L.r[i]; } else { /* 待插记录大于d中最小值,小于d中最大值,插到d的 中间(需要移动d数组的元素) */ j=final++; /* 移动d的尾部元素以便按序插入记录 */ while(L.r[i].key<d[j].key) { d[(j+1)%L.length]=d[j]; j=(j-1+L.length)%L.length; } d[j+1]=L.r[i]; } for(i=1;i<=L.length;i++) /* 把d赋给L.r */ L.r[i]=d[(i+first-1)%L.length]; /* 线性关系 */
0
MAXINT 初始状态
1
49 0 49 0 49 3 49 3
2
38
3
65 65 65 0 65 4
4
97 97 97 97 0
5
76 76 76 76 -
6
13 13 13 13 -
7
27 27 27 27 -
第十章内部排序
10.2 插入排序
1、直接插入排序:续 •实现算法
Status InsertSort ( SqList &L ) { for ( i = 2; i <= L.length ; ++i ) if ( LT( L.r[i].key, L.r[i-1].key ) ) { L.r[0].key = L.r[i].key; //复制为哨兵 for ( j=i-1; LT( L.r[0].key, L.r[j].key ) ; - -j ) L.r[j+1] = L.r[j]; //后移记录 L.r[j+1] = L.r[0]; } } //InsertSort
1 物料管理
第十章 内部排序
学习内容
10.1 概述 10.2 插入排序 10.3 快速排序 10.4 选择排序 10.5 归并排序
SORT
2 物料管理
第十章 内部排序
10.1 概述
•定义
设有记录序列:{ R1、R2 ……….. Rn } 其相应的关键字序列为: { K1、K2 ……….. Kn }; 若存在一种确定的关系: Kx <= Ky <= … <= Kz,则将记录序列 { R1、R2 ……….. Rn } 排成按 该关键字有序的序列:{ Rx、Ry ……….. Rz } 的操作,称之为排序。
•性能分析 减少了查找比较次数,但并未降低时间复杂度,仍为O(n2)。 7
SORT
8 物料管理
第十章 内部排序
10.2 插入排序
3、 希尔(shell) 排序 •基本思想 先将整个待排记录序列分割成为若干个子序列分别进行直接插入排序,待整个序列 中的记录基本有序时,再对全体记录进行一次直接插入排序。
数据结构ppt 第10章 内部排序
量,在排序过程中将指针内容逐个修改为已经整理(排序)
过的后继记录地址。 优点:在排序过程中不移动元素,只修改指针。 本方法具有链表排序和地址排序的特点。
链表排序——排序时只移动指针; 地址排序——排序时先移动地址,最后再移动记录。
13
10.2 插入排序---表插入排序
例:关键字序列 T=(21,25,49,25*,16,08), 请写出表插入排序的具体实现过程。 *表示后一个25 解:假设该序列(结构类型)已存入一维数组V[7]中,将V[0] 作为表头结点。则算法执行过程为: i 关键字 V[i].key 指针 V[i].link MaxNum 5 6 0 1 2 0 1 21 4 3 2 25 0
97
final 76 76 76 65 97
38
first 38
final
97 final 97 final 76 97 final 13 first 13 first 27 13 first 27
first
38 38 38
10.2 插入排序---表插入排序
基本思想:在顺序存储结构中,给每个记录增开排序
冒泡排序的算法分析 时间效率:O(n2) — 因为要考虑最坏情况 空间效率:O(1)— 只在交换时用到一个缓冲单元 稳 定 性:稳定 — 25和25*在排序前后的次序未改变 详细分析: • 最好情况:初始排列已经有序,只执行一趟起泡,做 n-1 次关键码比较,不移动对象。 • 最坏情形:初始排列逆序,算法要执行n-1趟起泡,第i趟 (1 i n) 做了n- i 次关键码比较,执行了n-i 次对象交换。 此时的比较总次数KCN和记录移动次数RMN为:
3
10.2 插入排序---希尔(shell)排序(又称缩小增量排序) 基本思想:先将整个待排记录序列分割成若干子序列,分别
第10章内部排序
❖ 优点:比较的次数大大减少,全部元素比较次数仅为O(nlog2n)。
❖ 时间效率:虽然比较次数大大减少,可惜移动次数并未减少,所以排序 效率仍为O(n2) 。
❖ 空间效率:O(1)
❖ 稳定性:稳定
10.2.4 希尔(shell)排序(又称缩小增量排序) LOGO
❖ 基本思想
先将整个待排记录序列按照分割成若干子序列,分别进行直接插入排序,待整个 序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。
08 16 21
25* 49 25
第3趟:
pivotkey 49
08
16 21
low
high
25* 49 25
第4趟:
low high
08 16 21 25* 25 4499
LOGO
❖ 最好情况:初始序列无序,每次划分得到2个长度相当的子序列 ❖ 最坏情况:初始序列正序或逆序时,每次划分得到一个长度为1的子序
r[low]=r[0]; //支点记录到位; return low; //返回支点记录所在位置。
}//Partition
见教材P276
整个快速排序的递归算法:
➢ 要求:顺序存储结构
❖具体步骤:
➢ 附设两个指针low和high,初始值分别为子序列的第一个记录和最后一个记录所 在位置,设从子序列中任取一记录为pivotkey,开始下面操作: ① 从high所指位置起向前搜索找到第一个小于pivotkey的关键字记录并交换, ② 从low所指位置起向后搜索找到第一个大于pivotkey的关键字记录并交换, ③ 重复上面两步直至low=high为止。
➢ ① 顺序排序——排序时直接移动记录; ➢ ② 链表排序——排序时只修改指针; ➢ ③ 地址排序——排序时先修改地址,最后再移动记录。
数据结构课件_第10章 内部排序
4.什么叫内部排序和外部排序?
内部排序—待排序记录都在内存中 外部排序—待排序记录一部分在内存,一部分在外存
5.排序的分类?
交换排序、插入排序、选择排序、归并排序、基数排序
6.待排序记录数据类型的定义
#define MAXSIZE 1000 // 待排顺序表最大长度 typedef int KeyType; // 关键字类型为整数类型
象移动次数约为 n2/4。因此,直接插入排序
的时间复杂度为 o(n2)。
•直接插入排序是一种稳定的排序方法。
2) 折半插入排序
新元素插入到哪里? 在已形成的有序表中折半查找,并在适 当位置插入,把原来位置上的元素向后顺移。 插入位置 hight+1 i 例如: L.r 14 36 49 52 80 58 61 23 97 75
是否可以考虑 设计一个“黄 金分割”插入 算法
// 折半
if (L.r[0].key < L.r[m].key)
high = m-1; // 插入点在低半区
else low = m+1; // 插入点在高半区
}
3)希尔(shell)排序(又称缩小增量排序)
基本思想:先将整个待排记录序列分割成若干子序列,分 别进行直接插入排序,待整个序列中的记录“基本有序” 时,再对全体记录进行一次直接插入排序。 技巧:子序列的构成不是简单地“逐段分割”,而是将 相隔某个增量dk的记录组成一个子序列,让增量dk逐趟缩
{张三,男,16} 、 {赵六,女,17} 、{王五,男,17}、{李四,女,18}
R3 R2
不稳 定
大多数排序算法都有两个基本的操作: (1)比较两个关键字的大小
(2)将记录从一个位置移动到另一个位置
西安电子科技大学_数据结构_第十章内部排序_课件PPT
初始关键字序列:
12345678 49 38 65 97 76 13 27 49*
第一趟排序后:
38 49 65 76 13 27 49* 97
第二趟排序后:
38 49 65 13 27 49* 76 97
第三趟排序后:
38 49 13 27 49* 65 76 97
第四趟排序后:
38 13 27 49 49* 65 76 97
10.2 希尔排序算法
void ShellInsert(SqList &L,int dk) {//对顺序表L作一+i 1<i=<L=.eLn.getnhg;tih+;+i+) +)
iiff((LL..rr[[ii]]..kkeeyy<<LL..rr[[ii--d1k]]..kkeeyy)){{//需将L.r[i]插入有序增量子表
10.1 排序的基本概念(续)
正序与逆序
➢ 若有序表是按排序码升序排列的,则称为升序表或正序 表,否则称为降序表或逆序表。不失普遍性,我们一般 只讨论正序表。
排序方法度量
➢ 排序过程主要是比较记录的关键字和移动记录。因此排 序的时间复杂性可以算法执行中的数据比较次数及数据 移动次数来衡量。当一种排序方法使排序过程在最坏或 平均情况下所进行的比较和移动次数越少,则认为该方 法的时间复杂性就越好。
L.r[j+1] = L.r[j];
L.r[j+1] = L.r[0]; }//if
最好情况} 下// (I正ns序er)tSort
最坏情况下(逆序)
元素的❖ 比分较析次直数接为插: 入n 排- 1序算法中关键元字素的的比比较较次次数数和: 记(录n+移2动)(次n-数1)/2
第十章 内部排序1
0 1 2 3 4 5 6 i=1 7 (49 38 65 97 76 13 27 ) i=2 38 (38 49) 65 97 76 13 27 i=3 65 (38 49 65) 97 76 13 27 i=4 97 (38 49 65 97) 76 13 27 i=5 76 (38 49 65 76 97) 13 27 i=6 13 (13 38 49 65 76 97) 27
k’1≤k’2≤···≤k’n 或 k’1≥k’2≥···≥k’n
• 稳定与不稳定:若记录序列中的任意两个记录 Rx , Ry 的排序码 Kx= Ky ;如果在排序之前和排 序之后,它们的相对位置保持不变,则这种排序 方法是稳定的,否则是不稳定的 • 排序中的两种基本操作:
– 两个排序码的比较(通常是必须的)
n
0
1 2 3 4 97 76 65 49
5 6 7 38 27 13
若待排序记录是随机的,取平均值
排序码比较次数:
n2 4
n2 记录移动次数: 4
时间复杂度:T(n)=O(n² ) 空间复杂度:S(n)=O(1)
10.1.2 折半插入排序
• 对直接插入排序,在插入记录Ri时,改用折半查找 方法确定插入的位置 • 算法思想:在插入Ri时,前面的记录R1, R2 ,·· Ri -1 ·, 已经排好序,因此可用折半查找找到Ri的插入位置
算法描述 #define M 100 //最大记录个数 typedef struct { int key; //排序码域 ···· //其他域 · ·; }RcdType; //记录类型 typedef RcdType Rcdlist[M+1];
//用顺序表存放,记录0下标不用 假设Rcdlist R;排序前待排序的记录已顺序存放在 R中,记录个数为n i:排序趟数,j:移动次数,直接插入排序算法如下:
第10章 内部排序 资料水利水电学院.ppt
一、 直接插入排序 (Straight Insertion Sort)
基本思想是:假设待排序的记录存放在数组R[1..n]中。初始 时,R[1]自成1个有序区,无序区为R[2..n]。从i=2起直至i=n为止, 依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序 区。
当插入第i (i 1) 个记录时,前面的 R[1], …, R[i-1]已经排好 序。这时,用R[i]的关键字与R[i-1], R[i-2], … R[1] 的关键字顺序 进行比较,找到插入位置即将R[i]插入,插入位置之后的所有记 录依次向后移动。
InfoType otherinfo; //其它数据项
}RcdType;
typedef struct {
RcdType r[MAXSIZE+1]; // r[0] 闲置或用作哨兵单元
int length;
//顺序表长度
}SqList;
//顺序表类型
9
2. 评价排序算法好坏的标准: ① 时间性能分析 以算法中用得最多的基本操作的执行次数(或者其 数量级)来衡量,这些操作主要是比较元素、移动或 交换元素。在一些情况下,可能还要用这些次数的平 均数来表示。
13
直接插人排序算法描述: 方法:Ki与Ki-1,Ki-2,…K1依次比较,直到找到应插入的位置。 void InsertSort (SqList&L){ //对顺序表L作直接插入排序。
for(i=2;i<=L.length;++i) if LT(L.r[i].key,L.r[i-1].key){//“<”,需将L.r[i]插入有序子表 L.r[0]=L.r[i] //复制为哨兵 L. r[i] = L. r[i-1]; //后移 for ( j=i-2 ; LT(L.r[0].key,L.r[j].key); --j) L.r[j+1]=L.r[j]; //记录后移 L.r[j+1]=L.r[0] // 插入到正确位置 }
基本思想是:假设待排序的记录存放在数组R[1..n]中。初始 时,R[1]自成1个有序区,无序区为R[2..n]。从i=2起直至i=n为止, 依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序 区。
当插入第i (i 1) 个记录时,前面的 R[1], …, R[i-1]已经排好 序。这时,用R[i]的关键字与R[i-1], R[i-2], … R[1] 的关键字顺序 进行比较,找到插入位置即将R[i]插入,插入位置之后的所有记 录依次向后移动。
InfoType otherinfo; //其它数据项
}RcdType;
typedef struct {
RcdType r[MAXSIZE+1]; // r[0] 闲置或用作哨兵单元
int length;
//顺序表长度
}SqList;
//顺序表类型
9
2. 评价排序算法好坏的标准: ① 时间性能分析 以算法中用得最多的基本操作的执行次数(或者其 数量级)来衡量,这些操作主要是比较元素、移动或 交换元素。在一些情况下,可能还要用这些次数的平 均数来表示。
13
直接插人排序算法描述: 方法:Ki与Ki-1,Ki-2,…K1依次比较,直到找到应插入的位置。 void InsertSort (SqList&L){ //对顺序表L作直接插入排序。
for(i=2;i<=L.length;++i) if LT(L.r[i].key,L.r[i-1].key){//“<”,需将L.r[i]插入有序子表 L.r[0]=L.r[i] //复制为哨兵 L. r[i] = L. r[i-1]; //后移 for ( j=i-2 ; LT(L.r[0].key,L.r[j].key); --j) L.r[j+1]=L.r[j]; //记录后移 L.r[j+1]=L.r[0] // 插入到正确位置 }
数据结构Chap10 内部排序.ppt
85 ) 20 h 85 ) 20
85 ) 20
85 ) 20
13 20 30 39 42 70 85 )
算法描述
void BInsertSort (SqList &L)
{ // 对顺序表L作折半插入排序
for ( i=2; i<=L.length; ++i )
{ L.r[0] = L.r[i];
——少
排序过程中所需的辅助空间的大小 ——小
算法本身的复杂程度
10.2 插入排序
插入排序的准则:在有序序列中插入新的记录以 达到扩大有序区的长度的目的。 直接插入排序
排序过程:整个排序过程为n-1趟插入,即先 将序列中第1个记录看成是一个有序子序列, 然后从第2个记录开始,逐个进行插入,直至 整个序列有序。
增量序列取法
无除1以外的公因子 采用缩小增量法 最后一个增量值必须为1
11.3 交换排序
基本思想:两两比较待排序记录的关键字,发现 两个记录的次序相反时即进行交换,直到没有反序 的记录为止。
两种交换排序: (1)冒泡排序 (2)快速排序
冒泡排序
最简单的一种交换排序方法 排序过程
将第一个记录的关键字与第二个记录的关键字进行比较, 若逆序则交换;然后比较第二个记录与第三个记录;依次类 推,直至第n-1个记录和第n个记录比较为止——第一趟冒泡 排序,结果关键字最大的记录被安置在最后一个记录上。
void ShellSort(RecType R[],int n) /*希尔排序算法*/
{ int i,j,d;RecType temp;
d=n/2;
/*d取初值n/2*/
while (d>0) {
for (i=d;i<n;i++) /*将R[d..n-1]分别插入各组当前有序区*/
数据结构课件第10章_内排序
按排序过程中使用到的存储介质来分,可以将排 序分成两大类 内排序和外排序。 序分成两大类:内排序和外排序。 两大类: 内排序是指在排序过程中所有数据均放在内存中 内排序是指在排序过程中所有数据均放在内存中 处理,不需要使用外存的排序方法。而对于数据量很 大的文件,在内存不足的情况下,则还需要使用外存, 这种排序方法称为外排序 这种排序方法称为外排序。 外排序。 排序码相同的记录,若经过排序后,这些记录 仍保持原来的相对次序不变,称这个排序算法是稳 仍保持原来的相对次序不变,称这个排序算法是稳 不稳定的排序算法。 定的。否则,称为不稳定的排序算法 定的。否则,称为不稳定的排序算法。
为了方便, 为了方便,r[0]一般不用 一般不用 于存放排序码, 于存放排序码,在一些排序 /*此处还可以定义记录中除排序码外的其它域* /*此处还可以定义记录中除排序码外的其它域*/ 算法中它可以用来作为中间 }recordtype; }recordtype; /*记录类型的定义*/ /*记录类型的定义* 单元存放临时数据。 单元存放临时数据。length 域是待排序的记录个数, 域是待排序的记录个数,它 typedef struct{ 必须不大于MAXSIZE,这样, 必须不大于 ,这样, recordtype r[MAXSIZE+1]; r[MAXSIZE+1 第1~length个记录的排序码 个记录的排序码 int length; length; /*待排序文件中记录的个数*/ /*待排序文件中记录的个数* 分别存于 r[1].key~r[length].key中 中 }table; /*待排序文件类型* /*待排序文件类型*/
最坏情况 : 即初始排序码开始是逆序的情况下,因为当插入 第i个排序码时,该算法内循环while要执行i次条件判 个排序码时,该算法内循环while要执行i 断,循环体要执行i 次,每次要移动1 断,循环体要执行i-l次,每次要移动1个记录,外循 环共执行n 环共执行n-1次,其循环体内不含内循环每次循环要 进行2 进行2次移动操作,所以在最坏情况下,比较次数为 (1+2+…+n)*(n-1),移动次数为 (1+2+…+n)*(n-1),移动次数为 (1+2+2+2+…+n+2)*(n-1)。假设待排序文件中的记录 (1+2+2+2+…+n+2)*(n-1)。假设待排序文件中的记录 以各种排列出现的概率相同,因为当插入第i 以各种排列出现的概率相同,因为当插入第i个排序码 时,该算法内循环while平均约要执行i/2次条件判断, 时,该算法内循环while平均约要执行i/2次条件判断, 循环体要执行(i 循环体要执行(i-l)/2次,外循环共执行n-1次,所以 /2次,外循环共执行n 平均比较次数约为(2+3+…+n)/2*(n-1),平均移动次 平均比较次数约为(2+3+…+n)/2*(n-1),平均移动次 数为(n-1)*(2+1+3+1+…+n+1)/2,也即直接插入排序 数为(n-1)*(2+1+3+1+…+n+1)/2,也即直接插入排序 算法的时间复杂度为O(n 算法的时间复杂度为O(n2)。
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
13
8.2 交换排序
冒泡排序
排序过程
将第一个记录的关键字与第二个记录的关键字进行 比较,若为逆序r[1].key>r[2].key,则交换;然 后比较第二个记录与第三个记录;依次类推,直至 第n-1个记录和第n个记录比较为止——第一趟冒 泡排序,结果关键字最大的记录被安置在最后一个 记录上 对前n-1个记录进行第二趟冒泡排序,结果使关键 字次大的记录被安置在第n-1个记录位置 重复上述过程,直到“在一趟排序过程中没有进行 过交换记录的操作”为止
7
折半插入排序 排序过程:用折半查找方法确定插入位置的排序叫~
例 i=1
(30) 13 70 85 39 42 6 20
i=2 13 (13 30) 70 85 39 42 6 20
…...
i=7 6 (6 i=8 20 (6
s i=8 20 (6
s i=8 20 (6
i=8 20 (6
i=8 20 (6
时间复杂度:T(n)=O(n²) 空间复杂度:S(n)=O(1)
9
希尔排序(缩小增量法) 排序过程:先取一个正整数d1<n, 把所有相隔d1的记录放一组,组内 进行直接插入排序;然后取d2<d1, 重复上述分组和排序操作;直至 di=1,即所有记录放进一个组中排 序为止
10
例 初始: 49 38 65 97 76 13 27 48 55 4 取d1=5 一趟分组:49 38 65 97 76 13 27 48 55 4
13 30 39 42 70 85 ) 20
13 30 39 m
13 30 39 mj 13 30 39
s mj
42 70 42 70 42 70
85 ) 20 j 85 ) 20
85 ) 20
13 30 39 42 70 85 ) 20 js
13 20 30 39 42 70 85 )
8
算法描述 算法评价
关系是任意的,如通常经常使用的小于、大于等关系。 • 稳定与不稳定:若记录序列中的任意两个记录 Rx、Ry 的关键字 Kx = Ky ;如果在排序之前和排序之后,它们的相对位置保持不变 ,则这种排序方法是稳定的,否则是不稳定的。
1
插入排序
有序表中插入元素,并保持其有序 直接 折半 2-路 表 希尔
一趟排序:13 27 48 55 4 49 38 65 97 76 取d2=3 二趟分组:13 27 48 55 4 49 38 65 97 76
二趟排序:13 4 48 38 27 49 55 65 97 76 取d3=1 三趟分组:13 27 48 55 4 49 38 65 97 76 三趟排序:4 13 27 38 48 49 55 65 76 97
11
算法描述
#define T 3 int d[]={5,3,1};
1 2 3 4 56
78
9 10
例
1439 2378 6458 9575 746 1439 2378 6458 9575 746
j j j j ji i i i i 1 2 3 4 5 6 7 8 9 10 一趟排序:13 247 48 3585 247 49 5358 65 97 76
第十章 内部排序
• 分类: •内部排序:全部记录都可以同时调入内存进行的排序。 •外部排序:文件中的记录太大,无法全部将其同时调入内存进行的排 序。
• 定义:设有记录序列:{ R1、R2 ……….. Rn } 其相应的关键字 序列为: { K1、K2 ……….. Kn }; 若存在一种确定的关系: Kx <= Ky <= … <= Kz则将记录序列 { R1、R2 ……….. Rn } 排成按 该关键字有序的序列: { Rx、Ry ……….. Rz } 的操作,称之为 排序。
交换排序
将表中关键字比较,位置不对交换
内
冒泡 快速
部
选择排序
先查找关键字,再交换。
排
简单 树型 堆
序
归并排序
将两个有序的关键字序列进行归并
基数排序
不比较,按多关键字排序方法
2
10.1 插入排序 直接插入排序 排序过程:整个排序过程为n-1趟插入, 即先将序列中第1个记录看成是一个有序 子序列,然后从第2个记录开始,逐个进 行插入,直至整个序列有序
jjjjjj 排序结果:(13 27 38 49 65 76 97)
4
算法评价
时间复杂度
若待排序记录按关键字从小到大排列(正序)
关键字比较次数:
n
1 n 1
记录移动次数:
i2 n
2 2(n 1)
i2
0 1 2 34 5 6 7 13 27 38 49 65 76 97
5
若待排序记录按关键字从大到小排列(逆序)
算法描述
3
0 1 2 34 5 6 7 例 i=1 (49) 38 65 97 76 13 27
i=2 38 (38 49) 65 97 76 13 27 i=3 65 (38 49 65) 97 76 13 27 i=4 97 (38 49 65 97) 76 13 27 i=5 76 (38 49 65 76 97) 13 27 i=6 13 (13 38 49 65 76 97) 27 i=7 27 (13 2378 3489 4695 6756 7967) 9277
j j j ji ij ij ij i i i 1 2 3 4 5 6 7 8 9 10 二趟排序:13 4 48 38 27 49 55 65 97 76
12
希尔排序特点
子序列的构成不是简单的“逐段分割”,而 是将相隔某个增量的记录组成一个子序列 希尔排序可提高排序速度,因为
分组后n值减小,n²更小,而T(n)=O(n²), 所以T(n)从总体上看是减小了关键字较小 的记录跳跃式前移,在进行最后一趟增量 为1的插入排序时,序列已基本有序 增量序列取法 没有除1以外的公因子 最后一个增量值必须为1
14
例 1 4398 38 38 38 3183 13 2 3489 49 49 4193 132387 27 3 65 65 6153 142397 23780 30 4 9776 7163 162357 243790 39 49 6 19237 732607 3605 65 7 293770 3706 76 8 3907 97
关键字比较次数:
n i (n2)(n1)
i2
2
记录移动次数:
n
(n4)(n1)
(i1)
i2
2
0 1 2 34 5 6 7 97 76 65 49 38 27 13
6
若待排序记录是随机的,取平均值
关键字比较次数:
n2 4
记录移动次数:
n2 4
T(n)=O(n²)
空间复杂度:S(n)=O(1)
8.2 交换排序
冒泡排序
排序过程
将第一个记录的关键字与第二个记录的关键字进行 比较,若为逆序r[1].key>r[2].key,则交换;然 后比较第二个记录与第三个记录;依次类推,直至 第n-1个记录和第n个记录比较为止——第一趟冒 泡排序,结果关键字最大的记录被安置在最后一个 记录上 对前n-1个记录进行第二趟冒泡排序,结果使关键 字次大的记录被安置在第n-1个记录位置 重复上述过程,直到“在一趟排序过程中没有进行 过交换记录的操作”为止
7
折半插入排序 排序过程:用折半查找方法确定插入位置的排序叫~
例 i=1
(30) 13 70 85 39 42 6 20
i=2 13 (13 30) 70 85 39 42 6 20
…...
i=7 6 (6 i=8 20 (6
s i=8 20 (6
s i=8 20 (6
i=8 20 (6
i=8 20 (6
时间复杂度:T(n)=O(n²) 空间复杂度:S(n)=O(1)
9
希尔排序(缩小增量法) 排序过程:先取一个正整数d1<n, 把所有相隔d1的记录放一组,组内 进行直接插入排序;然后取d2<d1, 重复上述分组和排序操作;直至 di=1,即所有记录放进一个组中排 序为止
10
例 初始: 49 38 65 97 76 13 27 48 55 4 取d1=5 一趟分组:49 38 65 97 76 13 27 48 55 4
13 30 39 42 70 85 ) 20
13 30 39 m
13 30 39 mj 13 30 39
s mj
42 70 42 70 42 70
85 ) 20 j 85 ) 20
85 ) 20
13 30 39 42 70 85 ) 20 js
13 20 30 39 42 70 85 )
8
算法描述 算法评价
关系是任意的,如通常经常使用的小于、大于等关系。 • 稳定与不稳定:若记录序列中的任意两个记录 Rx、Ry 的关键字 Kx = Ky ;如果在排序之前和排序之后,它们的相对位置保持不变 ,则这种排序方法是稳定的,否则是不稳定的。
1
插入排序
有序表中插入元素,并保持其有序 直接 折半 2-路 表 希尔
一趟排序:13 27 48 55 4 49 38 65 97 76 取d2=3 二趟分组:13 27 48 55 4 49 38 65 97 76
二趟排序:13 4 48 38 27 49 55 65 97 76 取d3=1 三趟分组:13 27 48 55 4 49 38 65 97 76 三趟排序:4 13 27 38 48 49 55 65 76 97
11
算法描述
#define T 3 int d[]={5,3,1};
1 2 3 4 56
78
9 10
例
1439 2378 6458 9575 746 1439 2378 6458 9575 746
j j j j ji i i i i 1 2 3 4 5 6 7 8 9 10 一趟排序:13 247 48 3585 247 49 5358 65 97 76
第十章 内部排序
• 分类: •内部排序:全部记录都可以同时调入内存进行的排序。 •外部排序:文件中的记录太大,无法全部将其同时调入内存进行的排 序。
• 定义:设有记录序列:{ R1、R2 ……….. Rn } 其相应的关键字 序列为: { K1、K2 ……….. Kn }; 若存在一种确定的关系: Kx <= Ky <= … <= Kz则将记录序列 { R1、R2 ……….. Rn } 排成按 该关键字有序的序列: { Rx、Ry ……….. Rz } 的操作,称之为 排序。
交换排序
将表中关键字比较,位置不对交换
内
冒泡 快速
部
选择排序
先查找关键字,再交换。
排
简单 树型 堆
序
归并排序
将两个有序的关键字序列进行归并
基数排序
不比较,按多关键字排序方法
2
10.1 插入排序 直接插入排序 排序过程:整个排序过程为n-1趟插入, 即先将序列中第1个记录看成是一个有序 子序列,然后从第2个记录开始,逐个进 行插入,直至整个序列有序
jjjjjj 排序结果:(13 27 38 49 65 76 97)
4
算法评价
时间复杂度
若待排序记录按关键字从小到大排列(正序)
关键字比较次数:
n
1 n 1
记录移动次数:
i2 n
2 2(n 1)
i2
0 1 2 34 5 6 7 13 27 38 49 65 76 97
5
若待排序记录按关键字从大到小排列(逆序)
算法描述
3
0 1 2 34 5 6 7 例 i=1 (49) 38 65 97 76 13 27
i=2 38 (38 49) 65 97 76 13 27 i=3 65 (38 49 65) 97 76 13 27 i=4 97 (38 49 65 97) 76 13 27 i=5 76 (38 49 65 76 97) 13 27 i=6 13 (13 38 49 65 76 97) 27 i=7 27 (13 2378 3489 4695 6756 7967) 9277
j j j ji ij ij ij i i i 1 2 3 4 5 6 7 8 9 10 二趟排序:13 4 48 38 27 49 55 65 97 76
12
希尔排序特点
子序列的构成不是简单的“逐段分割”,而 是将相隔某个增量的记录组成一个子序列 希尔排序可提高排序速度,因为
分组后n值减小,n²更小,而T(n)=O(n²), 所以T(n)从总体上看是减小了关键字较小 的记录跳跃式前移,在进行最后一趟增量 为1的插入排序时,序列已基本有序 增量序列取法 没有除1以外的公因子 最后一个增量值必须为1
14
例 1 4398 38 38 38 3183 13 2 3489 49 49 4193 132387 27 3 65 65 6153 142397 23780 30 4 9776 7163 162357 243790 39 49 6 19237 732607 3605 65 7 293770 3706 76 8 3907 97
关键字比较次数:
n i (n2)(n1)
i2
2
记录移动次数:
n
(n4)(n1)
(i1)
i2
2
0 1 2 34 5 6 7 97 76 65 49 38 27 13
6
若待排序记录是随机的,取平均值
关键字比较次数:
n2 4
记录移动次数:
n2 4
T(n)=O(n²)
空间复杂度:S(n)=O(1)