计算机软件基础课件-2017-第4章-1-排序

合集下载

软件技术基础2-4-排序

软件技术基础2-4-排序
排序过程:用折半查找方法确定插入位置的排序叫~
例 i=1
Hale Waihona Puke (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
13 30 39 42 70 85 ) 20
2 交换排序
冒泡排序
排序过程
将第一个记录的关键字与第二个记录的关键字进行比较,若 为逆序r[1].key>r[2].key,则交换;然后比较第二个记录与第 三个记录;依次类推,直至第n-1个记录和第n个记录比较为 止——第一趟冒泡排序,结果关键字最大的记录被安置在最 后一个记录上
对前n-1个记录进行第二趟冒泡排序,结果使关键字次大的记 录被安置在第n-1个记录位置
i=7 27 (13 2378 4398 6459 6756 7967) 9277 jjjjjj
排序结果:(13 27 38 49 65 76 97)
算法评价
时间复杂度
若待排序记录按关键字从小到大排列(正序)
关键字比较次数:
n
1

n
1
i2
记录移动次数:
若待排序记录按关键字从大到小排列(逆序)
重复上述过程,直到“在一趟排序过程中没有进行过交换记 录的操作”为止
初始关键字
49 38 65 97 76 13 27 30
算法描述
算法评价
时间复杂度
最好情况(正序)
比较次数:n-1
移动次数:0
最坏情况(逆序)

【精品】计算机软件技术基础PPT课件 第4章 查找与排序技术

【精品】计算机软件技术基础PPT课件 第4章 查找与排序技术

四、字符串匹配算法
字符串匹配: 从字符串中找到一个子字符串(从正文S中查找 模式p的位置)。
算法思路: ①、从正文S和模式p的第一个字符开始逐个比较; ②、若所有字符都匹配则找到子字符串,结束; ③、若有不匹配,则将模式p沿正文S向后移一个位
置,回到①执行。 上述过程直到正文比较完。
字符串的匹配算法描述
一、顺序查找
1、顺序查找 指在线性表中依次查找关键字的方法,一般
来说效率较低,但在以下两种情况下只能采取顺 序查找。
①、顺序存储的线性表为无序表; ②、有序表以链式存储结构存储。
最坏情况复杂度:W(n)=n
2、顺序存储结构下的顺序查找
PROCEDURE SERCH(V,n,x,k) k=1 WHILE (k≤n AND V(k)≠x) DO k=k+1 IF k=n+1 THEN k=0 RETURN k
当有序表长度为n时,W(n)=log2(n)+1。
3、对分查找的算法描述
在顺序存储的非递减有序表V(1:n)中,查找 x 出 现的位置k,若线性表中无 x,则令k=0。
PROCEDURE BSERCH(V,n,x,k) i=1 ; j=n WHILE i≤j DO
{ k=INT((i+j)/2) IF x=V(k) THEN RETURN k IF x<V(k) THEN j=k-1 ELSE i=k+1 }
3、分块有序表的查找
KEY(1:m) 22 46 86 K (1:m) 1 7 13
V(1:n) 22 12 13 8 9 20 33 42 44 38 24 46 60 58 74 47 86 53
算法思路: ①、对分查找索引表,确定待查项x可能所在 的子表。 ②、在相应的子表中顺序查找 x。

软件技术基础-排序1

软件技术基础-排序1

2.插入排序-直接插入排序
3)算法设计
R0 监视哨
R1,R2,…,Ri-1 有序区
Ri,Ri+1,…,Rn 无序区
2.插入排序-直接插入排序
4)算法实现 InsertSort(R) rectype R[n+1]; // R[0]备用, R[1]~R[n]为n个待排序记录 {int i,j; 为何计数器从2开始 for(i = 2;i <= n;i++) //外层循环控制进行n-1趟排序 { R[0] = R[i]; //将待插入记录存放在监视哨中 j = i - 1; 为何没有j>=0判断条件 while(R[0].key < R[j].key) //在当前有序区查找插入位臵 { R[j+1] = R[j];j--; //将关键字大于R[j].key的记录后移 } 会不会丢失R[i]的值 R[j+1] = R[0]; //插入R[i] } }
插入排序:直接插入排序、希尔排序 交换排序:冒泡排序、快速排序 选择排序:简单选择排序 归并排序:2-路归并排序
1.排序的基本概念
4)内部排序所用的存储结构: 以一维数组作为存储结构 排序过程是对记录本身进行物理重排,即通过比较和 判定,把记录移动合适的位臵。 以链表作为存储结构 排序过程中无须移动记录,仅需修改指针即可,通常 把这类排序称为表排序。 为排序文件建立辅助表 有的排序方法难以在链表上实现,此时,若仍需要避 免排序过程记录的移动,可以为文件记录一个辅助表 (如索引表),这样,排序过程中只需对这个辅助的 表进行物理重排,而不移动记录本身。
1.排序的基本概念
1)排序的概念:
就是整理文件中的记录,将它们按照关键字值的递增或递减的顺序 排列起来。 假设文件中含有n个记录(R1,R2,…,Rn),它们的关键字分别为k1,k 2,…,kn,我们将这n个记录重排为Ri1,Ri2,…,Rin,使得ki1≤ki2 ≤… ≤ kin(或ki1≥ki2 ≥ … ≥ kin),这就是排序。 排序前:

计算机科学导论第第4章讲稿程序设计基础PPT课件

计算机科学导论第第4章讲稿程序设计基础PPT课件

计2算020机/10/科17 学导论
5
4.2.1 结构化程序设计方法
➢ 采用自上而下解决问题的思路如图:
需要解决的复杂问题
二级子问题 ...
三级子问题 ...
二级子问题
三级子问题 ...
… 二级子问题 ...
… 三级子问题 ...
最小问题
最小问题 … 最小问题
计2算020机/10/科17 学导论
6
a
A Y S N
b
计2算020机/10/科17 学导论
15
② do-while循环
先执行A框操作,然后判断给定 条件S是否成立,如果成立,再 次执行A操作;然后再对S进行 判断,如此反复,直到给定的S 条件不成立为止。此时不再执 行A框,从出口b脱离循环。
a
A
Y S
N b
计2算020机/10/科17 学导论
21
4.2.2 面向对象的程序设计方法
11
已知梯形两底a、b和高h,设计一个求梯形面积的算 法,并画出流程图。
计2算020机/10/科17 学导论
12
⑵ 选择结构
选择结构中包含一个判断框,根据给定的条件S 是否成立而选择执行A框或B框,当条件成立时,执 行A,否则执行B。判断框中的两个分支,执行完A 或B后都必须汇合在一起,从出口b 退出,然后接 着执行其后的过程。
用这种方法逐步分解,直到作者认为可以直接将各 小段表达为文字语句为止。这种方法就叫 做“自顶向
计2算020机/10/科17 学导论
7
4.2.1 结构化程序设计方法
2.结构化方法 ➢ 结构化方法有助于在正式编写程序之前充分
理解问题的实质和实现方法,并且可以在具 体编码过程中提供指导。

《计算机软件基础》PPT课件

《计算机软件基础》PPT课件
6、支持网络功能和多媒体技术(内置TCP/IP协议、 Windows网络登录等功能,使各种资源可在网上共 享)。
7、支持GBK大字符集(2万多汉字字符)及多种字库。
8、系统庞大、开销大,启动、关机慢。
第 14 页
三种操作系统的比较
操作系统 多生产 硬件要求 多用户 多任务 市场 用户 编程界面 网络 安全性
厂商
支持 支持
界面
功能
MS-DOS MS PC机及 否 IBM 兼容机
否 PC机 字符 静态 界面 类库
差 一般
Windows MS PC机及 否 是 PC机 字符界 静态类库
兼容机
面及图 多种API 强
形界面 VXD编
程接口
较强
UNIX
IMB 各种机器 是
HP Sun等
是 小型机 字符界 静态类库 工作站 面及图 多种API 很强 服务器 形界面
第7页
3、操作系统的分类P116
上一页 停止放映
下一页
1、按处理器特点分:
• 分时OS 采用分配时间片的方法,一个CPU可为多个用户服务。 • 实时OS 在较短时间内即响应用户要求并完成处理的O S。 2、按适用面分: • 专用OS 为特定应用目的或特定机器环境而配备的OS。 • 通用OS 为通用计算机系统配备的OS。 3、按用户数量分: • 单用户OS 只能服务于单个用户的OS;如MS-DOS。 • 多用户OS 能为多个用户服务的OS;如UNIX、WINDOWSNT。 4、按任务处理方式分: • 交互式OS 能为用户提供交互式操作支持的OS。 • 批处理式OS 以批处理方式处理用户作业的OS。 5、按硬件环境和控制方式分: • 集中式OS 指驻留在一台计算机上或管理一台计算机的OS。 • 分布式OS 用于管理分布式计算机的OS。

计算机导论 第4章 计算机软件基础PPT课件

计算机导论 第4章 计算机软件基础PPT课件

操作系统的功能
进程的特征 1.动态性。进程是动态产生,动态消亡,进程在生 命周期内,在三种基本状态之间转换 2.并发性。任何进程都可以同其他进程一起并发执 行 3.独立性。能被CPU调度的独立运行的基本单位 4.异步性。进程之间相互制约,使进程具有执行的 间断性,即按各自独立、不可预知的速度向前推进。 5.结构特性。进程=程序+数据+进程控制块
2、共享性(sharing) 指操作系统中的资源可被多个并发执行的进 程共同使用,而不是被一个进程所独占。 资源共享的方式可以分成两种: 第一种是互斥访问。第二种是同时访问。 共享性和并发性是操作系统两个最基本的特 性,它们互为依存。
3、虚拟性(virtual)
把物理上的一个实体变成逻辑上的多个对应物
操作系统的功能
资源管理:操作系统对设备和信息资源按照 一定策略进行分配和调度。
1.存储管理,分配内存空间及收回 2.处理器管理,按照策略将处理器交替地分 配给系统内等待运行的程序。
3.设备管理,分配和回收外部设备,控制外 部设备按用户程序的要求进行操作。
4.信息管理,向用户提供文件系统
操作系统的功能
操作系统(OS)
操作系统对内管理计算机的资源和控制程序 的运行,扩展硬件功能。
操作系统对外提供良好的人机界面,方便用 户使用计算机。
最重要、最基本的系统软件。也是最底层的 软件。
常用的系统有DOS、WINDOWS、UNIX、 Linux等。
操作系统
操作系统的主要功能: 资源管理 程序控制 人机交互 进程管理等
程序控制 执行某种程序设计语言编写的源程序时,
通过调入编译程序,将源程序转换为目标程 序,分配相应的存储空间,按程序的要求执 行。

软件技术---排序

软件技术---排序
第2章 常用数据结构及其运算
11、排序
一、排序的基本概念
1、排序:将无序的数据序列排列成按关键字有序的序列。关键字 可以是主关键字也可以是次关键字。若是主关键字,则排序结 果是唯一的;若是次关键字,则排序结果不唯一。
2、内部排序:文件在内存中处理,排序时不涉及内、外存数据交 换。
3、外部排序:排序过程要进行内外数据交换。 4、排序稳定性:如果待排序的文件中,存在有多个关键字相同的
23
53
建成堆
基于初始堆进行堆排序
0
49
1
2
25
21
3
45
25* 16 08
0 08
1
2
25
21
3
45
25* 16 49
49 25 21 25* 16 08 初始最大堆
08 25 21 25* 16 49
交换 0 号与 5 号对象, 5 号对象就位
0
25
1
2
25*
21
3
45
08 16 49
25 25* 21 08 16 49
2、直接插入排序
将当前无序区的第一个记录插入到有序区中适当位置。
示例:已知一关键字序列(503,87,512,908,170, 276,436,316),请给出采用直接插入排序算法对该序 列按升序排序时的每一趟的排序结果。
初始关键字:[503] 87 512 908 170 276 436 316 第一趟排序:[87 503] 512 908 170 276 436 316 第二趟排序:[87 503 512] 908 170 276 436 316 第三趟排序:[87 503 512 908] 170 276 436 316 第四趟排序:[87 170 503 512 908] 276 436 316 第五趟排序:[87 170 276 503 512 908] 436 316 第六趟排序:[87 170 276 436 503 512 908] 316 第七趟排序:[87 170 276 316 436 503 512 908]

ch4_2排序 《软件技术基础》 教学课件

ch4_2排序 《软件技术基础》 教学课件

状态 6
8 150 4
7
2
3
Next域
0
1 2 3 45 6 7 8
i=1 MAXINT 13 38 65 97 76 49 27 49
j=6 6 p=7
(6) 1 5 0 4 8 2 3
0
1 2 3 45 6 7 8
i=2 MAXINT 13 27 65 97 76 49 38 49
j=7 6 p=2
❖算法复杂度
表插入排序的基本操作是将一记录插入到已排好序的链表 中。因此总比较次数与直接插入排序相同, 修改指针总次 数为2n次,所以时间复杂度仍为 O(n2)
16
表插入排序示例
0
1 2 3 45 6 7 8
初始 MAXINT 49 38 65 97 76 13 27 49 Key域
状态 0
----
(4)
//数据元素应在这分量中,不用调整,处理下一节点
(5) ②若j>i, l->r[i].elem 与l->r[j].elem 交换
(6)
p=l->r[j].next; //保存下一节点地址
(7)
l->r[j].next=l->r[i].next; l->r[i].next=j; //保持后续链表不被中断
4.2 排序
§4.2.1 排序的基本概念 §4.2.2 插入排序 §4.2.3 交换排序 §4.2.4 选择排序 §4.2.5 归并排序 §4.2.6 内部排序方法的比较和选择 §4.2.7 小结
1
4.2.1 排序的一般概念
排序定义——将一个数据元素(或记录)的任意序列,
重新排列成一个按关键字有序的序列叫~
j=(5), 8 6

软件技术基础_姚全珠_第4章查找和排序(绝对免费!供大家学习)

软件技术基础_姚全珠_第4章查找和排序(绝对免费!供大家学习)
计 算
第四章


件 基
查找与排序

本章内容
❖ 4.1 查找与排序概述
计 算
❖ 4.2 线性表上的查找
机 软
❖ 4.3 二叉树上的查找

❖ 4.4 哈希查找
基 础
❖ 4.5 直接插入排序
❖ 4.6 交换排序
❖ 4.7 选择排序
❖ 4.8 多关键字排序
4.1 查找与排序概述
计 算
1.与查找有关的概念

2.与排序有关的概念
计 算 机
(1)排序:指将一组记录按照指定关键字 大小递增(或递减)的次序排列起来。

(2)稳定性:若待排序的一组记录中存在

多个关键字值相同的记录,如果使用某种

排序排序前相比没有改变,
则称此排序算法具有稳定性。
稳定性举例
10 continue end
3.算法说明
算法中的整型变量low、high、mid分别用于标

识查找区间的左端点、右端点及中间位置。在升序排

列的线性表中,若待查元素关键字值小于中间位置元

素的关键字值,则待查元素只可能出现在区间上半部,

故缩小查找区间到原区间的上半部(区间左端点不变,

区间右端点变为mid –1);若待查元素关键字值大

则需n-i+1次比较。因此在等概率条件下查找成功的
础 平均查找长度为:
ASL
n
n
pici
pi (n i 1) 1
n
(n i 1) n 1
i 1
i 1
n i1
2

计算机软件基础系列课件

计算机软件基础系列课件


(2)栈的运算 设置一个空栈 判定栈是否为空 进栈、退栈 读取栈顶元素等

栈 (STACK) 也是一种特殊的线性表, 是一种“后进先出”的结构,它的 运算规则受到一些约束和限定,故
又称限定性数据结构
(1)栈的结构特点

栈是限定仅在表尾进行插入和删除 运算的线性表,表尾称为栈顶(top), 表头称为栈底(bottom)
#include <stdio.h> #include <string.h> #define TSIZE 45 #define FMAX 5
/*存储片名的数组大小*/ /*影片的最大数量*/
struct film { char title[TSIZE]; int rating; };
int main(void) { struct film movies[FMAX]; int i = 0; int j; puts("亲,输入第一部电影名:");
info next
信息域

指针域
最后一个结点没有后继结点,指针它的指针域为空(记为NIL 或∧)。 另外还需要设置一个指针head,指向单链表的第一个结点
链表的一个重要特点是插入、删除运算灵活方便,不需移动结点,只要改变结点 中指针域的值即可
插 入
Head a b Head

a x
b


删 除
Head a b c
用动态内存分配数据
int n; struct film* movies; printf("请输入电影的最大数量: %d\n"); scanf("%d", &n); movies = (struct film*)malloc(n * sizeof(struct film));

计算机应用基础课件1.6排序

计算机应用基础课件1.6排序

<例>直接插入排序:
次数i r[0] r[1] r[2] r[3] r[4] r[5] r[6] r[7] r[8] (49) 39 66 96 76 11 37 50
i=2 39 (39 49) 66 96 76 11 37 50 i=3 66 (39 49 66) 96 76 11 37 50 i=4 96 (39 49 66 96) 76 11 37 50
1.直接插入排序: 时效分析
1.6.2 插入排序
该算法适合 于n 较小的 情况,时间 复杂度为 O(n2).
最好情况:初始排序码已经有序。共比较n-1次,移动0次。
最坏情况:待排序序列完全逆序。比较和移动均为n(n-1)/2次。
n1
1 2 3i n 1 i
n(n 1)
i 1
2
平均情况:比较和移动次数均约为n2/4,时间复杂度为O(n2)。
49 38 65 97 76 13 27 30
13 13 3287 13 43706 65 76
思想:小的浮起, 大的沉底。
第第 第 一二 三 趟趟 趟
第第 四五 趟趟
第第 六七 趟趟
时效分析:
程序代码:
初始已排好序(正序最好),则只需进行一趟排序,比较次数n-1,移动次数 为0。 逆序(最坏),则需进行n-1趟排序, 比较次数为(1+2+3+…+n-1)=n(n-1)/2。 是稳定的排序,时间复杂度为O(n2 ),空间复杂度是O(1) .
次大元素放在n-1位置上。 第i趟冒泡排序:对前面n-i+1个元素进行相同操作,结
果(n-i+1)中最大元素放在(n-i+1)位置上。
结束条件: 在某一趟排序中没有进行交换元素操作。

基础班计算机软件基础课件

基础班计算机软件基础课件
n 育
22
v(1). 虚拟内存用硬盘空间模拟内存
内存空间
真正内存 虚拟内存
最大容量与CPU的寻址能力有关 32位CPU最大可达4GB。
演示设置虚拟内存
2023/11/1
同方教育
23
o (2) 存储器分配
目的:提高存储器的利用率,提高系统速度。
n 多个进程共享存储器,分配、释放存储器 n 进程需要的存储空间是变化的
同方教育
18
两个常考概念
o (2)分时处理
n 时间片
o (3)并行处理
n 多处理器
2023/11/1
同方教育
19
1). 单道程序系统: 任一时刻只允许一个程序在系统中执行。一
个程序执行结束后才能执行下一个程序。
CPU
2023/11/1
程序A
程序B
同方教育
时间t 程序C
20
2). 多道程序系统:多道程序同时在执行。
2).即插即用(Plug and Play,简称PnP)
指把设备连接到计算机上后无需手动配置可以立即 使用。即插即用技术需要设备和操作系统的支持。
2023/11/1
同方教育
32
3.提高使用效率
通道和缓冲。
n 缓冲区:介于两个设备或设备与应用程序之间传递 数据的内存区域。提供给不同速度的设备之间传递 数据。
2023/11/1
同方教育
48
语言处理系统
★高级语言源程序需经解释或编译后,转换为 计算机能直接执行的目标程序。
★语言处理程序用于把人们编制的汇编语 言和高级语言源程序转换为机器能够理 解的目标程序
2023/11/1
同方教育
49
语言处理系统
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
17
算法的实现要点:
从R[i-1]起向前进行顺序查找,监视哨
设置在R[0];
R[0]
R[i]
j 插入j位=i置-1
R[0] = R[i];
// 设置“哨兵”
for (j=i-1; R[0].key<R[j].key; --j);
// 从后往前找
循环结束表明R[i]的插入位置为 j +1
18
对于在查找过程中找到的那些关键字不小于R[i].key的记录,在查 找的同时实现记录向后移动;
选取其他增量序列还可以更进一步减少时间代价,如 O(n1.3)
增量序列中的值互质
} ElemType;
typedef struct{
ElemType R[MAXSIZE+1];
int length; //线性表长度
} RecordList;
• 线性表L中的记录存放从L.R[1]开始,
存储单元L.R[0]用作监视哨。
13
4.2 插入排序
基本思想:将一个线性表分为有序序列和无序序列两部分, 待无序序列中的记录按照其关键字值的大小插入到已有序的 子序列的适当位置,直到全部记录有序为止。 •根据无序序列中的元素插入到有序序列的方式,插入排序一 般可分为:
R[1..j].key R[i].key < R[j+1..i-1].key;
2. 将R[j+1..i-1]中的所有记录均后移
一个位置;
3. 将R[i] 插入(复制)到R[j+1]的位置上。
16
插入排序动画
45 34 78 12 34’ 32 29 64
初始状态: [45] 34 78 12 34 32 29 64 第1趟:(34)[34 45] 78 12 34 32 29 64 第2趟:(78)[34 45 78] 12 34 32 29 64 第3趟:(12)[12 34 45 78] 34 32 29 64 第4趟:(34)[12 34 34 45 78] 32 29 64 第5趟:(32)[12 32 34 34 45 78] 29 64 第6趟:(29)[12 29 32 34 34 45 78] 64 第7趟:(64)[12 29 32 34 34 45 64 78]
for (j=i-1; R[0].key<R[j].key; --j); R[j+1] = R[j]
R[0]
R[i]
j 插入j=位i-置1
上述循环结束后可以直接进行“插入”
19
插入排序算法
令 i = 2,3,…, n, 实现整个序列的排序。 for ( i=2; i<=n; ++i ) if (R[i].key<R[i-1].key) { 在 R[1..i-1]中查找R[i]的插入位置; 插入R[i] ; }
25
3.Shell排序
先将序列转化为若干小序列,在这些小序列内进行插入排序, 然后逐渐扩大小序列的规模,而减少小序列个数,使得待排序 序列逐渐处于更有序的状态,最后对整个序列进行扫尾直接插 入排序,从而完成排序。
26
shell排序动画
45 34 78 12 34’ 32 29 64
27
“增量每次除以2递减”的Shell排序-参考
9
内部排序的方法
内部排序的过程是一个逐步扩大记录的有序序列长度的过程。 有序序列区 无 序 序 列 区
经过一趟排序
有序序列区 无 序 序 列 区
10
内部排序方法分类
基于不同的“扩大”有序序列长度的方法,内部排序方法大 致可分下列几种类型:
• 插入类——将无序子序列中的一个或几个记录“插入”到有序序列中,从而 增加记录的有序子序列的长度。
7
对于不稳定的排序方法,只要能举出一个实例说明即可。 例如: 对 { 4, 3, 4, 2 } 进行快速排序,得到 { 2, 3, 4, 4 }
快速排序是不稳定的排序方法。
8
2.排序的分类
• 若整个排序过程不需要访问外存便能完成,则称此类排 序问题为内部排序。
• 若参加排序的记录数量很大, 整个序列的排序过程不 可能在内存中完成,则称此类排序问题为外部排序。
此该算法为稳定排序算法。
2)该算法仅利用了一个记录的辅助存储空间。
3)当数据表为正序表(表中的元素已按照关键字从小到大的顺序排列)
时,每次循环只需要记录比较一次,移动记录0次,整个算法数据比较
次数和元素移动次数分别为
和0,此时时间复杂度为O(n)。
22
4)当数据表为逆序表(表中的元素已按照关键字从大到小的顺 序排列)时,第i次循环中需要比较记录i次和移动记录i+1次,所 以总的比较和移动次数分别为:
用顺序存储结构存储数据元素,但同时建立一个辅助表。
12
采用顺序存储结构存放所要排序的记录:
#define MAXSIZE 100 //线性表可能的最大长度,例如100。
typedef int KeyType; //假定的关键字类型
typedef struct
{
KeyType key; //关键字
int otheritem; // 为简便起见,假定其他的数据项用整型数据表示。
• 直接插入排序 • 折半查找排序 • 希尔排序
14
1.直接插入排序
一趟直接插入排序的基本思想:
有序序列R[1..i-1]
无序序列 R[i..n]
R[i]
有序序列R[1..i] 无序序列 R[i+1..n]
15
实现“一趟插入排序”可分三步进行: 1. 在R[1..i-1]中查找R[i]的插入位置,
6
例: 排序前 ( 56, 34, 47, 23, 66, 18, 82, 47 )
若排序后得到结果
( 18, 23, 34, 47, 47, 56, 66, 82 )
则称该排序方法是稳定的; 若排序后得到结果
( 18, 23, 34, 47, 47, 56, 66, 82 )
则称该排序方法是不稳定的。
void ModInsSort(Record Array[], int n, int delta) { // 修改的插入排序算法,参数delta表示当前的增量 int i, j; for (i = delta; i < n; i += delta) // 对子序列中第i个记录,寻找合适的插入位置 for (j = i; j >= delta; j -= delta) { // j以dealta为步长向前寻找逆置对进行调整 if (Array[j] < Array[j-delta]) // 逆置对
• 基数类——是一种不要需要直接进行关键字比较的排序方法,通过多次采用 分配和收集两种策略来实现排序过程。
11
3. 排序算法的复杂度
• 时间复杂度——主要取决于关键字的比较次数和记录的移动次数。 • 空间复杂度——排序算法所需要的辅助空间取决于所用的算法本身。
✓ 辅助空间是O(1),这样的排序称为就地排序 ✓ 待排序列的存储方式主要有三种:顺序存储结构;链式存储结构;
20
void InsertionSort ( SqList &L ) { // 对顺序表 L 作直接插入排序。
for ( i=2; i<=L.length; ++i ) if (L.r[i].key < L.r[i-1].key) {
L.r[0] = L.r[i];
// 将待排序的记录复制为监视哨
void ShellSort(Record Array[], int n) { // Shell排序,Array[]为待排序数组,n为数组长度
int i, delta;
// 增量delta每次除以2递减
for (delta = n/2; delta>0; delta /= 2)
for (i = 0; i < delta; i++) // 分别对delta个子序列进行插入排序
//“&”传 Array[i]的地址,数组总长度为n-i
ModInsSort(&Array[i], n-i, delta); // 如果增量序列不能保证最后一个delta间距为1 // 可以安排下面这个扫尾性质的插入排序
// ModInsSort(Array, n, 1);
}
28
针对增量而修改的插入排序算法-参考
30
Shell排序选择增量序列
增量每次除以2“递减”时,效率仍然为O (n2)
问题:选取的增量之间并不互质
– 间距为2k-1的子序列都是由那些间距为2k的子序列组成的
– 上一轮循环中这些子序列都已经排过序了,导致处理效率不高
Hibbard增量序列
– {2k-1,2k-1-1,…,7,3,1},
Shell(3)和Hibbard增量序列的Shell排序的效率可以达 到O (n3/2)
swap(Array, j, j-delta); // 交换
else break; } }
29
算法分析
• 不稳定 • 空间代价:O (1) • 增量每次除以2递减,时间代价:O (n2) • 选择适当的增量序列,可以使得时间代价接近O (n)
Shell排序的分析是一个复杂问题,因为它的时间是所取 增量序列的函数,这涉及一些数学上尚未解决的难题。因 此,到目前为止尚未有人求得一种最好的增量序列,但大 量的研究已得出一些局部的结论。
例如:将下列关键字序列 52, 49, 80, 36, 14, 58, 61, 23, 97, 75(无序序列)
调整为
14, 23, 36, 49, 52, 58, 61 ,75, 80, 97(有序序列)
相关文档
最新文档