第八章 排序
(完整word版)数据结构 第八章排序

第八章排序:习题习题一、选择题1.在所有排序方法中,关键字比较的次数与记录的初始排列次序无关的是( )。
A.希尔排序B.冒泡排序C.插入排序D.选择排序2.设有1000个无序的记录,希望用最快的速度挑选出其中前10个最大的记录,最好选用( )排序法。
A.冒泡排序B.快速排序C.堆排序D.基数排序3.在待排序的记录序列基本有序的前提下,效率最高的排序方法是( )。
A.插入排序B.选择排序C.快速排序D.归并排序’4.不稳定的排序方法是指在排序中,关键字值相等的不同记录的前后相对位置( )。
A.保持不变B.保持相反C.不定D.无关5.内部排序是指在排序的整个过程中,全部数据都在计算机的( )中完成的排序。
A. 内存储器B.外存储器C.内存储器和外存储器D.寄存器6.用冒泡排序的方法对n个数据进行排序,第一趟共比较( )对记录。
A.1B.2C.n-lD.n7.直接插入排序的方法是从第( )个记录开始,插入前边适当位置的排序方法。
A.1B.2C.3D.n8.用堆排序的方法对n个数据进行排序,首先将n个记录分成( )组。
A.1B.2C.n-lD.n9.归并排序的方法对n个数据进行排序,首先将n个记录分成( )组,两两归并。
A.1B.2C.n-lD.n10.直接插入排序的方法要求被排序的数据( )存储。
A.必须是顺序B.必须是链表C.顺序或链表D.二叉树11.冒泡排序的方法要求被排序的数据( )存储。
A.必须是顺序B.必须是链表C.顺序或链表D.二叉树12.快速排序的方法要求被排序的数据( )存储。
A.必须是顺序B.必须是链表C.顺序或链表D.二叉树13.排序方法中,从未排序序列中依次取出记录与已排序序列(初始时为空)中的记录进行比较,将其放入已排序序列的正确位置上的方法,称为( )。
A.希尔排序B.冒泡排序C.插入排序D.选择排序14.每次把待排序的记录划分为左、右两个子序列,其中左序列中记录的关键字均小于等于基准记录的关键字,右序列中记录的关键字均大于基准记录的关键字,则此排序方法叫做( )。
(19)第八章 排序

21 21
i=2
0 25
1 21 21
2 25 25 25 25 25
3 49 49 49 49 49
4 5 25* 16 25* 16 25* 16 25* 16 25* 16
6 08 08 08 08 08
i=3
49
21 21
i=4
25*
21
21
25
25*
49
16
08
9
i=3
49
21 21
25 25 25 25 25
排序的时间开销: 排序的时间开销是衡量算法好 坏的最重要的标志。排序的时间开 销主要取决于算法执行中的数据比 较次数与数据移动次数。
4
内部排序分类
依排序的实现方法进行分类 插入排序、交换排序、选择排序、 归并排序、和基数排序等。 依算法的执行效率进行分类 简单排序---时间复杂度O(n2) 先进排序方法---时间复杂度O(n log2n)
25* 16 49 16
08
08 08
7
i=4
25*
21 21
i=2
0 25
1 21
21
2 25
25 25
3 49
49 49
4 5 25* 16
25* 16 25* 16
6 08
08 08
i=3
49
21
21
25
25 25
49
49 25*
25* 16
25* 16 49 16
08
08 08
8
i=4
25*
15
折半插入排序的算法 注意,最后折半结束
后有: higt+1=low void BinInsSort ( SqList &L ) { int low, high; for ( int i = 2; i < =L.length; i++) { //L.r[0]空闲无用 low = 1; high = i-1; L.r[0].key = L.r[i].key; while ( low <= high ) { //折半查找插入位置 int mid = ( low + high )/2; if ( L.r[0].key < L.r[mid].key ) high = mid - 1; else low = mid + 1; } for ( int j = i-1; j >= high+1; j-- ) L.r[j+1]= L.r[j]; //记录后移 L.r[high+1] = L.r[0]; //插入
教案数据的排序和筛选

数据的排序和筛选教学目标:1. 理解排序和筛选数据的概念及重要性。
2. 学会使用常用排序和筛选方法对数据进行处理。
3. 能够应用排序和筛选技术解决实际问题。
教学内容:第一章:数据的排序1.1 排序的概念1.2 排序的依据1.3 排序的方法1.4 排序的应用第二章:数据的筛选2.1 筛选的概念2.2 筛选的方法2.3 筛选的依据2.4 筛选的应用第三章:排序和筛选的结合3.1 排序与筛选的关系3.2 排序和筛选的结合方法3.3 结合排序和筛选解决问题的实例3.4 练习:结合排序和筛选处理数据第四章:排序和筛选在实际应用中的重要性4.1 排序和筛选在数据分析中的作用4.2 排序和筛选在决策支持中的应用4.3 排序和筛选在信息检索中的重要性4.4 实际案例分享:排序和筛选在商业决策中的应用第五章:排序和筛选技术的拓展5.1 高级排序方法介绍5.2 高级筛选方法介绍5.3 排序和筛选算法的优化5.4 拓展练习:运用高级排序和筛选技术解决复杂问题教学方法:1. 讲授:讲解排序和筛选的概念、方法和应用。
2. 案例分析:分析实际案例,让学生了解排序和筛选在实际应用中的重要性。
3. 练习:引导学生运用排序和筛选方法解决实际问题。
4. 小组讨论:分组讨论排序和筛选技术的拓展应用。
教学评估:1. 课堂问答:检查学生对排序和筛选概念的理解。
2. 练习题:评估学生运用排序和筛选方法解决问题的能力。
3. 小组报告:评价学生在小组讨论中的表现及对拓展排序和筛选技术的理解。
教学资源:1. 教材:数据排序和筛选相关教材。
2. 案例:提供实际案例,用于分析排序和筛选的应用。
3. 练习题:设计具有代表性的练习题,帮助学生巩固所学知识。
4. 计算机软件:用于演示排序和筛选操作。
第六章:排序和筛选工具的使用6.1 常见排序和筛选工具概述6.2 排序工具的使用方法6.3 筛选工具的使用方法6.4 实践练习:使用排序和筛选工具处理数据第七章:数据可视化与排序筛选7.1 数据可视化的基本概念7.2 排序与筛选在数据可视化中的作用7.3 数据可视化工具的排序筛选功能7.4 案例分析:数据可视化中的排序和筛选应用第八章:排序和筛选的算法原理8.1 排序算法的原理与实现8.2 筛选算法的原理与实现8.3 排序和筛选算法的性能分析8.4 练习:实现简单的排序和筛选算法第九章:大数据排序和筛选9.1 大数据排序和筛选的挑战9.2 大数据排序和筛选的策略9.3 大数据排序和筛选的算法优化9.4 案例分享:大数据环境下的排序和筛选应用第十章:排序和筛选的应用案例分析10.1 营销数据中的排序和筛选应用10.2 金融数据中的排序和筛选应用10.3 社交媒体数据中的排序和筛选应用教学评估:1. 练习题:设计具有代表性的练习题,帮助学生巩固所学知识。
数据结构第八章_排序

49 38 65 97 76
三趟排序:4 13 27 38 48 49 55 65 76 97
算法描述
#define T 3 int d[]={5,3,1};
例 13 48 97 55 76 4 13 49 27 38 65 49 27 38 65 48 97 55 76 4 j j j
j
j
i
例 初始: 49 38 65 97 76 13 27 48 55 4 取d1=5 49 38 65 97 76 13 27 48 55 4 一趟分组:
一趟排序:13 27 48 55 4 取d2=3 13 27 48 55 4 二趟分组:
49 38 65 97 76 49 38 65 97 76
二趟排序:13 4 48 38 27 49 55 65 97 76 取d3=1 13 27 48 55 4 三趟分组:
初始时令i=s,j=t
首先从j所指位置向前搜索第一个关键字小于x的记录,并和rp
交换 再从i所指位置起向后搜索,找到第一个关键字大于x的记录, 和rp交换 重复上述两步,直至i==j为止 再分别对两个子序列进行快速排序,直到每个子序列只含有 一个记录为止
快速排序演示
算法描述
算法评价
例
38 49 49 38 65 76 97 13 97 76 97 27 13 30 97 27 97 30 初 始 关 键 字
38 49 65 13 76 27 76 13 30 76 27 76 30 97 第 一 趟
38 49 13 65 27 65 13 30 65 27 65 30
38 13 49
时间复杂度
最好情况(每次总是选到中间值作枢轴)T(n)=O(nlog2n) 最坏情况(每次总是选到最小或最大元素作枢轴)
8-1-数据结构——从概念到C++实现(第3版)-王红梅-清华大学出版社

大 学
出
int length;
版 社
};
void MergeSort1(int first, int last);
void MergeSort2( );
void Print( );
排序类的定义
Sort :: Sort(int r[ ], int n)
void Sort :: Print( )
{
{
data = new int[n];
( 从 概 念
到
升序(非降序) 降序(非升序)
实 现
)
排序码:排序的依据, 简单起见,也称关键码。
不失一般性,做如下约定:
(1)进行升序排序
清 华 大 学 出 版 社
排序的数据模型是什么?
排序是对线性结构的一种操作
(2)记录只有排序码一个数据项 (3)采用顺序存储,且下标从 1 开始
正序、逆序
正序:待排序序列中的记录已按关键码排好序。
快速排序
堆排序
二路归并非递归算法
(2)不基于比较:根据待排序数据的特点所采取的其他方法
第八章 v 排序技术
8-1-2 排序算法的性能
排序算法的性能
如何衡量排序算法的性能呢?
(1)时间性能:排序算法在各种情况(最好、最坏、平均)下的时间复杂度。
数
例如,基于比较的内排序在排序过程中的基本操作:
据 结 构
( 从 概 念
到
升序(非降序) 降序(非升序)
实 现
)
排序码:排序的依据,
职工号
姓名
性别
年龄
工作时间
清 华
大
简单起见,也称关键码。 0001
0002
王刚 张亮
算法导论 第八章 线性时间排序

Decision-tree example
• Sort <a1,a2, a3>=<9,4,6>
1:2
• A decision tree can model the execution of any comparison sort: --One tree for each input size n. --View the algorithm as splitting whenever it compares two elements. -- The tree contains the comparisons along all possible instruction traces. --The running time of the algorithm = the length of the path taken. -- Worst-case running time = height of tree.
Decision-tree example
• Sort <a1,a2, a3>=<9,4,6>
1:2
2:3
1:3
123
1:3
213
2:3 4≤6
132
312
231
321
• Each internal node is labelled i:j for i,j∈{1,2,…,n} --The left subtree shows subsequent comparisons if ai≤aj --The right subtree show subsequent comparisons if ai>aj
A: B:
4 1
1 2
小班《按规律排序》数学教案
小班《按规律排序》数学教案第一章:认识排序1.1 教学目标:了解排序的概念,知道排序是一种将物品按照某种特定的规律进行排列的方法。
能够观察并发现物品之间的规律,进行简单的排序活动。
1.2 教学内容:讲解排序的概念,通过实物展示和图片引导幼儿观察并发现物品之间的规律。
进行简单的排序活动,如按照大小、颜色、形状等规律进行排列。
1.3 教学方法:采用实物展示、图片引导和小组合作的方式进行教学,让幼儿通过观察和操作来理解和掌握排序的概念。
1.4 教学评估:通过观察幼儿在排序活动中的表现,评估他们对排序概念的理解和应用能力。
第二章:数字排序2.1 教学目标:能够理解数字的大小顺序,能够将数字按照从小到大的顺序进行排列。
2.2 教学内容:讲解数字的大小顺序,通过数字卡片和实物展示引导幼儿观察并发现数字之间的规律。
进行数字排序活动,如按照从小到大的顺序排列数字卡片。
2.3 教学方法:采用数字卡片、实物展示和小组合作的方式进行教学,让幼儿通过观察和操作来理解和掌握数字排序的方法。
2.4 教学评估:通过观察幼儿在数字排序活动中的表现,评估他们对数字排序的理解和应用能力。
第三章:形状排序3.1 教学目标:能够识别不同的形状,能够将形状按照某种特定的规律进行排列。
3.2 教学内容:讲解形状的分类和排序方法,通过形状卡片和实物展示引导幼儿观察并发现形状之间的规律。
进行形状排序活动,如按照形状的大小、颜色等规律进行排列。
3.3 教学方法:采用形状卡片、实物展示和小组合作的方式进行教学,让幼儿通过观察和操作来理解和掌握形状排序的方法。
3.4 教学评估:通过观察幼儿在形状排序活动中的表现,评估他们对形状排序的理解和应用能力。
第四章:颜色排序4.1 教学目标:能够识别不同的颜色,能够将颜色按照某种特定的规律进行排列。
4.2 教学内容:讲解颜色的分类和排序方法,通过颜色卡片和实物展示引导幼儿观察并发现颜色之间的规律。
进行颜色排序活动,如按照颜色的顺序进行排列。
DS第8章 排序
第8章 排序
考纲分析
归并排序算法思想比较简单,但非递归实现比较难,重 点掌握一次归并的实现和归并排序的性能分析。基数排 序不是基于比较的排序方法,在考试中出现的概率比较 低,只要求掌握基数排序的分配和收集过程。 通过本章学习,需要深刻领会各种排序的思想、各种初 始排列(正序、逆序、随机)下算法的执行特点、算法 的性能分析(时间性能、空间性能、稳定性),以及算 法的设计过程,能够在深刻理解各种排序方法的基础上 对各种排序方法进行综合比较。各种排序方法不但要求 会写出来,重要的是理解算法以及算法的执行过程,因 此,复习时要手工运行算法,掌握算法运行过程中的某 些规律。
第8章 排序
8.2 排序的基本概念 1. 考核知识点 5) 排序的分类 根据在排序过程中待排序的所有记录是否全部被 放置在内存中,可将排序方法分为内排序和外排 序两大类。内排序是指在排序的整个过程中,待 排序的所有记录全部被放置在内存;外排序是指 由于待排序的记录个数太多,不能同时放置在内 存,而需要将一部分记录放置在内存,另一部分 记录放置在外存,整个排序过程需要在内外存之 间多次交换数据才能得到排序的结果。
教材P.235.
注意比较次数 比树高少1
8.2 排序的基本概念 典型题解析
选择题2:一个待排序的n个记录可分为n/k组,每组包 含k个记录,且任一组内的各记录分别大于前一组内的 所有记录且小于后一组内的所有记录,若采用基于比较 的排序方法,其时间下界为( )。 A. O(klog2k) B. O(klog2n) C. O(nlog2k) D. O(nlog2n) 解答: C 分析:由题意,只需对每一组记录序列单独排序。对于 具有k个记录的序列进行基于比较的排序,其时间下界 为O(klog2k) ,共n/k组,因此,总的时间下界为 O(n/k*klog2k)= O(nlog2k) 。
第八章 时间序列
环比 定基 环比 定基
120.2 120.2 20.2 20.2
113.8 136.8 13.8 36.8
117.7 161.0 17.7 61.0
108.6 174.8 8.6 74.8
33
三、平均发展速度和平均增长速度
1. 观察期内各环比发展速度 的平均数 2. 说明现象在整个观察期内平均发展变化的 程度
动态速度指标
10
第二节
时间序列的水平分析
一、发展水平
• 是时间序列中每一项具体的指标数值。说明
现象在某一时间上所达到的水平。可是绝对数、 相对数、平均数。
• 假如时间序列为: a 0
a1
a 2 an 1 an
• a 0 叫最初水平, an 叫最末水平。 • 还有中间各项水平、基期水平和报告期水平
ai a0 ai Gi 1 a0 a0
(i 1,2,, n)
32
发展速度与增长速度的计算
第三产业国内生产总值速度计算表
年 份
国内生产总值(亿元)
2004
14930.0 — — — —
2005
17947.2
2006
20427.5
2007
24033.3
2008
26104. 3
发展速度 (%) 增长速度 (%)
18
日期 人数
•
12.31 1000
1.31 1050
3.31 1070
6.30 1100
• 求前半年的平均人数 。 1月份平均人数= (1000 1050) 2、3月份平均人数= (1050 1070)
2
2
1025
1060
4、5、6月份平均人数= (1070 1100)
数据结构(C语言版)考研复习题
数据结构(C语言版)考研复习题第1 页共19 页第一章绪论1.1 简述下列概念:数据、数据元素、数据类型、数据结构、逻辑结构、存储结构、线性结构、非线性结构。
1.2 常用的存储表示方法有哪几种?1.3 算法的时间复杂度仅与问题的规模相关吗?1.4 有时为了比较两个同数量级算法的优劣,须突出主项的常数因子,而将低次项用大"O"记号表示。
例如,设T1(n)=1.39nlgn+100n+256=1.39nlgn+O(n), T2(n)=2.0nlgn-2n=2.0lgn+O(n), 这两个式子表示,当n足够大时T1(n)优于T2(n),因为前者的常数因子小于后者。
请用此方法表示下列函数,并指出当n足够大时,哪一个较优,哪一个较劣?函数大"O"表示优劣(1) T1(n)=5n22-3n+60lgn 5n22+O(n)(2) T2(n)=3n22+1000n+3lgn 3n22+O(n)(3) T3(n)=8n22+3lgn 8n22+O(lgn)(4) T4(n)=1.5n2+6000nlgn 1.5n2+O(nlgn)第二章线性表2.1 试描述头指针、头结点、开始结点的区别、并说明头指针和头结点的作用。
2.2 何时选用顺序表、何时选用链表作为线性表的存储结构为宜?2.3 为什么在单循环链表中设置尾指针比设置头指针更好?2.4 下述算法的功能是什么?LinkList Demo(LinkList L){ // L 是无头结点单链表ListNode *Q,*P;if(L&&L->next){Q=L;L=L->next;P=L;while (P->next) P=P->next;P->next=Q; Q->next=NULL;}return L;}// Demo2.5设线性表的n个结点定义为(a0,a1,...a n-1),重写顺序表上实现的插入和删除算法:InsertList 和DeleteList.2.6 设顺序表L是一个递减有序表,试写一算法,将x插入其后仍保持L的有序性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6 6 6 6 j 6 第 二 趟 第 一 趟
3 i t
9 j 9
1 i t 1 i t 1
3
8 j 8 j
6
3
9
6
3
9 i t
8 j
6
第 三 趟
简单选择排序
算法 void select(int *a,int n) {int i,j,k; for(i=0;i<n;i++) {k=i; for(j=i+1;j<n;j++) if(a[j]<a[k]) k=j; if(k!=i) swap(&a[k],&a[i]); }
时间复杂度:O(log2n)
例一趟快排序过程示例
r[1] r[2] r[3] r[4] r[5] r[6] r[7] r[8] r[9] r[10] 存储单元 49 14 38 74 96 65 8 49 55 27 记录中关键码 low=1;high=10; 设置两个搜索指针, □= r[0].ke65 8 49 55 27 ↑ ↑ low high 第一次搜索交换: 从high向前搜索小于r[0].key的记录,将r[high] 与□交换得到结果: 27 14 38 74 96 65 8 49 55 □ ↑ ↑ low high 从 low向 后搜索 ,修 改low 指 针 ,使low=low+1,找到第 一个大于 r[0].key的记录,将r[low]与□交换得到结果 27 14 38 □ 96 65 8 49 55 74 ↑ ↑ low high
第二次搜索交换 从high向前搜索,修改high指针使high=high-1,找到第一个小于r[0].key的记 录,将r[high]与□交换,得到结果 27 14 38 8 96 65 □ 49 55 74 ↑ ↑ low high 从low向后搜索,使low=low+1,找到第一个大于r[0].key的记录,将r[low]与 □交换,得到结果 27 14 38 8 □ 65 96 49 55 74 ↑ ↑ low high 第三次搜索交换 从high向前搜索,修改high指针使high=high-1,找到第一个小于r[0].key的记录 ,直到high=low为止,得到结果 27 14 38 8 □ 65 96 49 55 74 ↑↑ low high 从 low 向 后 搜 索 使 low=low+1, 找 到 第 一 个 大 于 r[0].key 的 记 录 , 直 到 high=low为止,得到结果 27 14 38 8 □ 65 96 49 55 74 ↑↑ low high low=high,划分结束,填入支点记录, 27 14 38 8 49 65 96 49 55 74, 再以49为界分为左右两边继续快速排序.左边序列为27 14 38 8 ,选27 为关键码,右边序列为65 96 49 55 74,以65作为关键码继续排序
8.3.2 快速排序 (对冒泡排序的改进)
思想:通过一趟排序将待排序列分成两部分,使其中一部分记 录的关键字均比另一部分小,再分别对这两部分排序,以达到 整个序列有序。 关键字通常取第一个记录的值为基准值。 做法: ① low=p;high=q; r[0]=r[low];
② 若low=high,支点空位确定,即为low。 r[low]=r[0]; 否则,low<high,搜索需要交换的记录,并交换之 ③ 若low<high且r[high].key≥r[0].key high=high-1;转③ r[low]=r[high]; ④ 若low<high且r[low].key<r[0].key low=low+1;转④ r[high]=r[low]; 转② //继续寻找支点空位
改进的冒泡程序: void bubble(int *a,int n) {int t,i,j,flag=1; for(i=0;i<n&&flag;i++) {flag=0; for(j=n-1;j>i;j--) if(a[j-1]>a[j]) {t=a[j-1];a[j-1]=a[j];a[j]=t;flag=1;} } }
思想:小的 浮起,大的 沉底。从后 面开始比, 第一次得到 最小的放第 一位,第二 次排序得到 第二小的放 第二位…
25 56 49 78 11 65 41 36
初 始 关 键 字
11 25 56 49 78 36 65 41
第 一 趟 排 序 后
25 36 56 49 78 41 65
第 二 趟 排 序 后
对于有n个数 据元素的待排 序列,插入操 作要进行n-1 次
第三次排序: [15 27 36 53] 69 42
第四次排序: [15 27 36 53 69] 42
第五次排序: [15 27 36 42 53 69]
直接插入排序示例
该算法适合于n 较 小的情况,时间复 杂度为O(n2).
插入算法如下: 方法:Ki与Ki-1,K i-2,…K1依次比较,直到找到应插入的位置。
8.2 插入排序
直接插入
1、直接插入排序: 基本思想:从数组的第2号元素开 始,顺序从数组中取出元素,并将 该元素插入到其左端已排好序的数 组的适当位置上。
8.2 插入排序
直接插入
直接插入排序: 基本思想:从数组的第2号元素开始,顺序从数组中取出元素, 并将该元素插入到其左端已排好序的数组的适当位置上 待排元素序列:[53] 27 36 15 69 42 第一次排序: 第二次排序: [27 53] 36 15 69 42 [27 36 53] 15 69 42
24
36
24
85 91 36 85 12
47 24
30
53 12
85
47 24
30
53
91 47 30 (c) 53 12
36
85 47 91 (d)
30
53
(4)由无序序列建初始堆的过程(最小值在最上面) 53 53 53 36 30 36 30 36 12 85 47 12 24 91 47 12 24 85 47 30 24 (a)无序序列 (c): 30被筛选 91 (b): 91被筛选后的状态 85 n=8, int(n/2)=4开始 91 后的状态 53 36 85 47 30 12 24 85 36 47 30 12 53 24 85 36 47 30 12 24 53
8.2.2.希尔排序 改进的直接插入排序算法: ① 选择一个步长序列t1,t2,…,tk,其中ti>tj,tk=1; ② 按步长序列个数k,对序列进行k趟排序; ③ 每趟排序,根据对应的步长ti,将待排序列分割成若干长 度为m的子序列,分别对各子表进行直接插入排序。仅步 长因子为1时,整个序列作为一个表来处理,表长度即为整 个序列的长度。
(b):堆顶元素取最小值
(1) 如何由一个无序序列按关键码建成一个堆?
(2) 输出堆顶元素后,如何将剩余元素调整成一个新的堆?
(3) 输出堆顶元素并调整建新堆的过程(筛选) 把自堆顶至叶子的调整过程称为“筛选‘。从一个无序序 列建堆的过程就是一个反复”筛选“的过程。 91 12 (a) (b)
36
n个记录进行冒泡排序的算法如下 : 1) i=0; /*从0个记录的表开始*/ 2) 若i≥n,排序结束. 3) j=n-1; /*一趟冒泡,设置从第n-1个记录开 始进行两两比较*/ 4) 若j≤i;一趟冒泡结束,i=i+1;,转 2) 5) 比较r[j-1].key与r[j].key,若r[j-1].key≤r[j].key, 不交换,转7) 6) 当r[i-1].key>r[j].key时, 将r[j-1]与r[j]交换 7) j=j-1; 调整对下两个记录进行两两比较,转4)
10
76
24
33
4
15
5
1 2 3 r[0] = 10 m=5 i=1
堆排序算法
void heapsort(int *r,int n) {int i; for(i=n/2;i>=1;i--) sift(r,i,n); for(i=n;i>=2;i--) {r[0]=r[1]; r[1]=r[i]; r[i]=r[0]; sift(r,1,i-1); } }
8.4.2 堆排序 也是一种选择排序。是具有特定条件的顺序 存储的完全二叉树,其特定条件是:任何一个非叶子结点的关 键字大于等于(或小于等于)子女的关键字的值。 11 89 (1) 堆的示例 76 24 25 36
33
15
10
56
49
78
(a):堆顶元素取最大值 (2) 实现堆排序需解决两个问题:
36 41 56 49 78 65
第 三 趟 排 序 后
41 49 56 65 78
第 四 趟 排 序 后
49 56 65 78
第 五 趟 排 序 后
冒泡排序算法: void bubble(int *a,int n) {int i,j; for(i=0;i<n;i++) for(j=n-1;j>i;j--) if(a[j-1]>a[j]) swap(&a[j-1],&a[j]); }
待排序列为 39,80,76,41,13,29,50,78,30,11, 100,7,41,86用希尔排序方法进行排序。
8.3 交 换 排 序
交换排序的特点在于交换。有冒泡和快速排序两种。 8.3.1、冒泡排序(起泡排序) 小的浮起。从右端开始比较。 第一趟:第n-1个与第n个比较,大则交换;第n-2个与第n-1个 比较, 大则交换,……关键字最小的记录交换到第一个位置 上; 第二趟:对后n-1个记录进行同样的操作,关键字次小的记录交 换 到第2个位置上; 依次类推,则完成排序。 正序:时间复杂度为O(n) 逆序:时间复杂度为O(n2) 适合于数据较少的情况。 排序n个记录的文件最多需要n-1趟冒泡排序。