第8章 排序 8.1排序基本概念 8.2插入类排序 8.3交换类排序 8.4选择类排序 8.5归并排序 8.6基数排序

Slides:



Advertisements
Similar presentations
历尽九九八十一难, 唐僧四人终于到达天竺, 取得真经,完成任务。 四人想着难得到天竺一趟, 不如在此游览一番。
Advertisements

一、中国湿地面临的威胁 目前,湿地污染严重,湖泊 富营养化问题突出。随着社 会经济的快速发展,湿地污 染在很长时期内依然严重。 湿地污染 1.
中共盘县发展和改革局党组主体责任落实情况报告
我们毕业了 毕业留念册 再见老师 姓名:黄巧灵 班级:六(1)班 毕业时间:2012年6月.
专题二:城市化与城乡规划 授课教师:周栋文.
第二章 城市轨道交通系统的构成 城市轨道交通系统的分类 2.1 2.2 车辆与车辆段 2.3 轨道交通限界
延庆县“十二五”时期城乡基础设施 建设规划 2011年03月.
2011届高三地理高考复习课件 拉丁美洲 高三地理备课组.
滚 滚 长 江 安匠初中:李艳阁.
长江的开发 惠州市河南岸中学 谢国文.
白海豚的分布范围.
关于市场营销的分析 ——以九阳豆浆机为例 品牌经营——让每一个家庭都拥有一台九阳豆浆机 营销管理——采取文化、概念、网络等营销组合
第二章 中药总论 ----中兽药的基本知识.
超视距安保防范系统 克拉玛依市格恩赛电子科技有限公司 2015年8月.
-矿产资源勘查开采的有关法律知识介绍 四川省国土资源厅 陈东辉
第二十章 第3节 电磁铁 电磁继电器.
主讲:计算机工程学院 李兰 答疑地点:主教学楼B区213
2013年三好校園實踐學校 多元.實踐~博雅建中人~
长江.
陆路交通发达,公路、铁路交通为主,基本上没有水运
第二章 工程造价计价依据第一节 施工定额 概 述 工作时间的研究分析 劳动定额 材料消耗定额
103年高雄市自然與生活科技學習領域教學研習 動物單元的 教學理念與實踐 講師:屏東縣和平國小 周鳳文.
神 山 圣 湖.
世界地理总论 人文地理概况.
授课教师简历 刘付才,男,中学高级教师,亳州一中南校体 育教研组长,全国体育优质课一等奖获得者,华佗 五禽戏第五十八代传承人;长期从事五禽戏教学和 研究工作,参与创编了国家级课题“校园五禽戏”; 2014年全国学生运动会展示中获得优秀表演奖; 2015年指导的五禽戏传人进行的五禽戏教学获得全 国一等奖,编著的《华佗五禽戏之简易健身操》即.
第四章 水域生物群.
东京城市建设史简述.
洪涝灾害重点传染病的预防 江苏省疾病预防控制中心 汪华.
贵州讲解.
小 桔 灯 市场赢利能力与战略 主讲:杨贤耀.
第十章 内部排序 知识点3:快速排序.
第九章 排序 插入排序 交换排序 选择排序 归并排序 基数排序.
9.1 概述 9.2 插入排序 9.3 交换排序 9.4 选择排序 9.5 归并排序 9.6 基数排序 9.7 各种内部排序的比较
院系:政史学院历史系 班级:10级4班 学号: 姓名:蒋阿晴
第5章 回溯法 “通用的解题法” 欢迎辞.
第8章 查找 在英汉字典中查找某个英文单词的中文解释;在新华字典中查找某个汉字的读音、含义;在对数表、平方根表中查找某个数的对数、平方根;邮递员送信件要按收件人的地址确定位置等等。可以说查找是为了得到某个信息而常常进行的工作。 计算机、计算机网络使信息查询更快捷、方便、准确。要从计算机、计算机网络中查找特定的信息,就需要在计算机中存储包含该特定信息的表。如要从计算机中查找英文单词的中文解释,就需要存储类似英汉字典这样的信息表,以及对该表进行的查找操作。本章将讨论的问题即是“信息的存储和查找”。
第五章 树 东南大学计算机学院 方效林 本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件.
第十章 内部排序 10.1 概述 10.2 插入排序 直接插入排序 其他插入排序 希尔排序
有大权炳的天使 (18:1-3) 巴比伦大城倾倒了!倾倒了! 天上的声音 (18:4-20) (4-8) 一天之内,她的灾殃要一齐来到。
合肥公交集团 营运效能分析报告 营 运 服 务 部.
企业引进顶级人才之门, 人才跨上顶级职业之路 。
新疆旅游资源 ——伊犁哈萨克自治州.
第8章 查找 数据结构(C++描述).
践行新时期广东精神 推进广东公路文化繁荣与发展 ——关于广东省公路文化建设与实践的思考
第8章 排序.
第十章 排序.
第九章 排序 概述 插入排序 交换排序 选择排序 归并排序 基数排序 外排序.
第五章 图论 5.6平面图 例 考虑把三座房和三种 设施每种都连接起来的问题, 如图7-64所示,是否有可能使 得这样的连接里不发生交叉?
排序 Sorting.
第九章 排序 9.1排序的基本概念 9.2简单排序方法(复杂度 O(n2)) 9.3先进排序方法(复杂度 O(nLogn))
快速排序法 (Quick Sort).
第9章 排序.
1、基本概念 2、插入排序 3、交换排序 4、选择排序 5、归并排序 6、基数排序 7、外部排序
第8章 排 序 8.1 排序技术概述 8.2 插入排序 8.3 选择排序 8.4 交换排序 8.5 归并排序 8.6 基数排序
第九章 查找 2018/12/9.
中央广播电视大学开放教育试点课程 数据结构 辅导教师 倪政林.
第9章 内部排序 9.1 概述 9.2 插入排序 9.3 快速排序 9.4 选择排序 9.5 归并排序 9.6 基数排序
数据结构 第9章 查找 什么是查找?? 静态查找 动态查找 哈希表 数据结构.
数据结构 Data Structure CSU 主讲人:王国军,郑瑾 中南大学信息院计科系
第九章 查找 2019/2/16.
数据结构 第八章 查找.
教 师:曾晓东 电 话: E_mail: 计算机软件技术基础 教 师:曾晓东 电 话: E_mail:
資料結構與C++程式設計進階 排序與搜尋 講師:林業峻 CSIE, NTU 6/ 14, 2010.
第5章 回溯法 欢迎辞.
第九章 排序 概述 插入排序 快速排序 交换排序(起泡排序) 选择排序 归并排序.
第1章 绪论(二) 教学目标 理解算法的特性及评价标准 掌握算法时间复杂度和空间复杂度的分析方法 1/
99高中資訊科選修課程 夥伴學習教師 專業進修研習 進階程式設計--演算法 教學示例與研討
累堆排序法 (Heap Sort).
算法的基本思想: 第6章 内部排序 6.2 气泡排序 将待排序的记录看作是竖着排列的“气泡”,关键字较小 的记录比较轻,从而要往上浮。
排序 排序(sorting)是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列。 由于待排序的记录数量不同,使得排序过程中涉及的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机存储器中进行的排序过程;另一类是外部排序,指的是待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中对外存进行访问的排序过程。
Presentation transcript:

第8章 排序 8.1排序基本概念 8.2插入类排序 8.3交换类排序 8.4选择类排序 8.5归并排序 8.6基数排序 8.1排序基本概念 8.2插入类排序 8.3交换类排序 8.4选择类排序 8.5归并排序 8.6基数排序 8.7各类排序方法的比较 8.8外部排序

8. 1 排序基本概念 1.内排序与外排序: 内排序:数据对象全部存放在内存; 8. 1 排序基本概念 1.内排序与外排序: 内排序:数据对象全部存放在内存; 外排序:对象个数太多,不能同时存放在内存,根据需要,不断在内、外存间移动。

2.稳定排序与不稳定排序 假设Ki=Kj,排序前序列Ri领先于Rj; 稳定排序:排序后序列中Ri领先于Rj。 例, 3 15 8 8 6 9 排序后 3 6 8 8 9 15 稳定 排序后 3 6 8 8 9 15 不稳定

两种基本操作: (1)比较两个关键字的大小; (2)将记录从一个位置移动到另一个位置。 常见的存储表示方法: 向量结构 链表结构 记录向量与地址向量结合

8.2 插入类排序 在一个已排好序的记录子集的基础上,将下一个待排序的记录有序地插入到已排好序的记录子集中,直到所有待排记录全部插入为止。

8.2.1直接插入排序 当插入第i 个对象时,前面v[0], v[1], …, v[i-1]已经排好序。用v[i]的关键码与v[i-1], v[i-2], …的关键码顺序进行比较,找到插入位置即将v[i]插入,原来位置上的对象向后顺移。

各趟排序结果 49 25 25* 21 16 08 0 1 2 3 4 5 49 25 25* 25 21 16 i = 1 08 0 1 2 3 4 5 temp 49 49 25 25* 21 16 i = 2 08 0 1 2 3 4 5 temp

49 25 25* 25* 21 16 i = 3 08 0 1 2 3 4 5 49 25 25* 21 16 16 i = 4 08 0 1 2 3 4 5 temp 49 25 25* 21 16 i = 5 08 08 0 1 2 3 4 5 temp

49 25 25* 21 16 完成 08 0 1 2 3 4 5 i = 4 时的排序过程 49 i = 4 j = 3 16 25 25* 21 16 16 08 0 1 2 3 4 5 temp 49 49 i = 4 j = 2 16 25 25* 21 16 08 0 1 2 3 4 5 temp

i = 4 j = 1 49 16 25 25* 25* 21 16 08 0 1 2 3 4 5 i = 4 j = 0 49 16 25 25 25* 21 16 08 0 1 2 3 4 5 temp i = 4 j = -1 49 16 25 25* 21 21 16 08 0 1 2 3 4 5 temp

void InsSort(RecordType r[],int length) /*对数组r做直接插入排序,length为长度*/ { for(i=2;i<length;i++) {r[0]=x=r[i];j=i-1; /*将待插入记录存放x中*/ while(x.key<r[j].key)/*寻找插入位置*/ { r[j+1]=r[j];j=j-1;} r[j+1]=r[0]; /*待插入记录插入已排序的序列中*/ } }

算法分析 最好情况,排序前对象有序,每趟只需与有序对象序列的最后一个比较 ,共比较n-1次。 待排序的对象个数为n,该算法执行n-1趟。 最好情况,排序前对象有序,每趟只需与有序对象序列的最后一个比较 ,共比较n-1次。 最坏情况,第 i 趟时第 i 个对象必须与前面 i 个对象都做关键码比较,并且每做 1 次比较就要做 1 次移动。则总的比较次数KCN和移动次数RMN为:

时间复杂度为 o(n2)。 稳定排序。

8.2.2希尔排序 排序序列有 n 个对象,首先取一个整数 gap < n 作为间隔,将全部对象分为 gap 个子序列,所有距离为 gap 的对象放在同一个子序列中,对每一个子序列直接插入排序。然后缩小间隔 gap,取 gap = gap/2,重复,直到最后取 gap =1为止。

49 25 25* 21 16 08 0 1 2 3 4 5 i = 1 49 Gap = 3 25 25* 21 16 08 49 25 25* 21 16 08 49 25 25* 21 16 08

49 25* 25 21 16 08 0 1 2 3 4 5 i = 2 49 Gap = 2 25* 25 21 16 08 49 25* 25 21 16 08 49 25* 25 21 16 08

开始 gap 值较大,子序列中对象较少,排序速度较快;随着gap 值变小,子序列中对象逐渐变多,由于大多数已基本有序,所以排序速度仍然很快。 49 25* 25 21 16 08 0 1 2 3 4 5 i = 3 49 Gap = 1 25* 25 21 16 08 开始 gap 值较大,子序列中对象较少,排序速度较快;随着gap 值变小,子序列中对象逐渐变多,由于大多数已基本有序,所以排序速度仍然很快。

void ShellInsert(RecordType r[],int length,int delta) /*对数组r做一趟希尔排序,length为长度,dalta为增量*/ { int i; for(i=1+delta;i<=length;i++) /*l+delta为第一个子序列的第二个元素的下标*/ if(r[i].key<r[i-delta].key) { r[0]=r[i]; /*备份r[i]*/ for(j=i-delta;j>0&&r[0].key<r[j].key;j-=delta) r[j+delta]=r[j]; r[j+delta]=r[0]; }} ShellSort(RecordType r[],int length,int delta[],int delta_len) /*对数组r做希尔排序,length为长度*/ { int i; for(i=0;i<delta_len;++i) ShellInsert(r, length ,delta[i]); }

8.2.3 折半插入排序 void BinSort(RecordType r[],int length) 8.2.3 折半插入排序 void BinSort(RecordType r[],int length) /*对记录r进行折半插入排序,length为长度*/ { for(i=1;i<= length;++i) { x=r[i]; low=1;high=i-1; while(low<=high) /*确定插入位置*/ { mid=(low+high)/2; if(x.key<r[mid].key)high=mid-1; else low=mid+1; } for(j=i-1;j>=low;--j) r[j+1]=r[j] ; /*记录向后移动*/ r[low]=x ;/*插入记录*/}}

算法分析 插入一个元素比较的次数最大为折半判定树的深度,如插入第i个元素时,需log2i次,插入n-1个元素的平均比较次数为O(n log2n)。 与直接插入排序法相比,比较次数减少,数据移动次数并未改变,时间复杂度为O(n2)。稳定排序。

8.3 交换类排序 8.3.1冒泡排序 相邻数据两两比较,如果逆序就交换,一趟比较交换后,最后一个位置的数据必然有序,然后继续下一趟,如此往复,直到序列全部有序为止。

49 25 25* 21 16 08 0 1 2 3 4 5 49 i = 1 25 25* 21 16 08 chang=TRUE 49 i = 2 25 25* 21 16 08 chang=TRUE 49 i = 3 25 25* 21 16 08 chang=TRUE

设置一个标记change: 开始前,change= FALSE , 发生交换令change =TRUE, 49 i = 4 25 25* 21 16 08 chang=FALSE 0 1 2 3 4 5 设置一个标记change: 开始前,change= FALSE , 发生交换令change =TRUE, 通过判断change,确定是否结束。

时间复杂度为O(n2) 。稳定排序。 void BubbleSort(RecordType r[],int length) /*对记录数组r做冒泡排序,length为长度*/ {n=length;change=TRUE; for(i=1;i<=n-1&&change;++i) { change=FALSE; for(j=1;j<=n-i;++j) if(r[j].key>r[j+1].key) {t=r[j];r[j]=r[j+1];r[j+1]=t;change=TRUE;}} } 时间复杂度为O(n2) 。稳定排序。

8.3.2 快速排序 取某个对象作基准,划分为左右两个子序列: 左侧子序列中所有对象的关键码小于或等于基准对象的关键码 右侧子序列中所有对象的关键码大于基准对象的关键码 然后对这两个子序列重复施行上述方法,直到所有的对象都排在相应位置上为止。

i = 1 i = 2 i = 3 pivot 49 25 25* 21 16 08 0 1 2 3 4 5 pivot pivot 49 0 1 2 3 4 5 pivot pivot 49 25 i = 1 25* 21 16 08 pivot 49 i = 2 25* 25 21 16 08 49 i = 3 25* 25 21 16 08

快速排序算法: QKSort(RecordType r[ ],int low,int high) /*对记录数组r[low..high]用快速排序算法排序*/ { if(low<high) { pos=QKPass(r,low,high); QKSort(r,low,pos-1); QKSort(r,pos+l,high); } } /*QKPass*/

一趟快速排序算法: int QKPass(RecordType r[],int left,int right) /*对r中的r[1eft]至r[right]部分进行一趟排序,得到基准的位置,使得排序后的结果满足其之后(前)的记录的关键字均不小于(大于)基准记录*/ {t=r[left]; /*选择基准记录*/ low=left;high=right; while(low<high) {while(low<high&&r[high].key>=t.key) /*high从右到左找小于t.key的记录*/ high--; if(low<high){r[low]=r[high];low++;} /*找到小于t.key的记录,则进行交换*/ while(low<high&&r[low].key<t.key) /*low从左到右找大于t.key*/ low++; if(low<high){r[high]=r[low];high--;} /*找大于t.key的记录,则交换*/ } r[low]=t; /*将基准记录保存到low=high的位置*/ return low; /*返回基准记录的位置*/ }/*QKPass*/

快速排序共需进行多少趟排序,取决于递归调用深度。 (1)最好情况:每趟将序列一分两半,正好在表中。同折半查找log2n,总的比较次数C(n)≤n+2C(n/2)。 (2)最坏情况:已经排好序,第一趟经过n-1次比较,第1个记录定在原位置,左部子表为空表,右部子表为n-1个记录。第二趟n-1个记录经过n-2次比较,第2个记录定在原位置,左部子表为空表,右部子表为n-2个记录,依此类推,共需进行n-1趟排序,其比较次数为: 执行次数为: T(n)≤Cn+2T(n/2)≤2n+4T(n/4)≤3n+4T(n/8)≤nlog2n+nT(1)≈O(n log2n) 其中Cn是常数,表示n个元素排序一趟所需时间。

8.4 选择类排序 8.4.1简单选择排序 第i趟简单选择排序是指通过n-i次关键字的比较,选出关键字最小的记录,并与第i个记录进行交换。

i = 0 i = 1 i = 2 初始 最小者 08 交换21,08 最小者 16 交换25,16 最小者 21 交换49,21 49 25* 21 16 08 0 1 2 3 4 5 49 最小者 08 交换21,08 i = 0 25 25* 21 16 08 49 最小者 16 交换25,16 i = 1 25 25* 21 16 08 49 最小者 21 交换49,21 25* 25 i = 2 21 16 08

i = 3 i = 4 最小者 25* 无交换 最小者 25 无交换 结果 各趟排序后的结果 49 25* 25 21 16 08 0 1 2 3 4 5 49 最小者 25 无交换 i = 4 25* 25 21 16 08 49 结果 25* 25 21 16 08 各趟排序后的结果

i =1时选择排序的过程 49 25 25* 21 16 08 0 1 2 3 4 5 49  25 i k j 49 25 25* 21 16 08 25*  25 i k j 49 25 25* 21 16 08 16 < 25 i k j

49 25 25* 21 16 08 0 1 2 3 4 5 21  16 i k j k 指示当前序列中最小者

简单选择排序算法: void SelectSort(RecordType r[],int length) /*对数组r做简单选择排序,length为长度*/ { n=length; for(i=1;i<n-1;++i) {k=i; for(j=i+1; j<n;++j) if(r[j].key<r[k].key)k=j; if(k!=i) {x=r[i];r[i]=r[k];r[k]=x;} } }/*SelectSort*/

算法分析 最好情况为正序排列,不需要移动记录。最坏情况为逆序排列,移动记录的次数最多3(n-1)。当i=1时,进行n-1次比较;当i=2时,进行n-2次比较,… ,共需要进行的比较次数是 时间复杂度为O(n2)。

8.4.2 堆排序 堆是完全二叉树,每个结点的关键字值均不小于(或不大于)左、右孩子结点的关键字值。分为大顶堆和小顶堆。

创建堆,取堆顶结点并把剩余结点调整成堆,继续…….,为堆排序。 完成两个操作: (1)把一个待排序的数据序列创建成一个堆。 (2)把取出堆顶的剩余结点调整成堆。

建立大顶堆 21 i i 21 1 1 2 2 25 49 25 49 3 4 5 3 4 5 25* 16 08 25* 16 08 21 25 49 25* 16 08 21 25 49 25* 16 08 初始关键码集合 i = 2 时的局部调整

i 21 49 1 1 2 2 25 49 25 21 3 4 5 3 4 5 25* 16 08 25* 16 08 21 25 49 25* 16 08 49 25 21 25* 16 08 i = 1 时的局部调整 i = 0 时的局部调整 形成最大堆

基于初始堆进行堆排序 最大堆中V[0] 与V[n]对调,最大关键码交换到最后,再对前面的n-1个对象,使用堆的调整算法FilterDown(0, n-1),重新建立最大堆。结果具有次最大关键码的对象又上浮到堆顶,即V[0]位置。 再对调V[0]和V[n-1],调用FilterDown(0, n-2),对前n-2个对象重新调整,…。 如此反复,得到排序好的对象序列。

49 08 1 1 2 2 25 21 25 21 3 4 5 3 4 5 25* 16 08 25* 16 49 49 25 21 25* 16 08 08 25 21 25* 16 49 初始最大堆 交换 0 号与 5 号对象, 5 号对象就位

25 16 1 1 2 2 25* 21 25* 21 3 4 5 3 4 5 08 16 49 08 25 49 25 25* 21 08 16 49 16 25* 21 08 25 49 从 0 号到 4 号 重新 调整为最大堆 交换 0 号与 4 号对象, 4 号对象就位

25* 08 1 1 2 2 16 21 16 21 3 4 5 3 4 5 08 25 49 25* 25 49 25* 16 21 08 25 49 08 16 21 25* 25 49 从 0 号到 3 号 重新 调整为最大堆 交换 0 号与 3 号对象, 3 号对象就位

21 08 1 1 2 2 16 08 16 21 3 4 5 3 4 5 25* 25 49 25* 25 49 21 16 08 25* 25 49 08 16 21 25* 25 49 从 0 号到 2 号 重新 调整为最大堆 交换 0 号与 2 号对象, 2 号对象就位

16 08 1 1 2 2 08 21 16 21 3 4 5 3 4 5 25* 25 49 25* 25 49 16 08 21 25* 25 49 08 16 21 25* 25 49 从 0 号到 1 号 重新 调整为最大堆 交换 0 号与 1 号对象, 1 号对象就位

8.5 归并排序 归并排序是通过不断地把若干个较小的有序表合并成较大的有序表。 8.5 归并排序 归并排序是通过不断地把若干个较小的有序表合并成较大的有序表。 序列长度为n,n个长度为1的有序序列,从头开始两两合并,得到(int)((n+1)/2)个长度≤2的有序序列,对这些序列继续两两合并,如此往复,直到合并成一个有序序列为止,这种排序方法称为2-路归并排序。

例,序列 { 49 , 38 , 65 , 97 , 76 , 13 , 27 } 初始 [49] [38] [65] [97] [76] [13] [27] [27] 一趟归并 [65 97] [13 76] [38 49] 二趟归并 [38 49 65 97] [13 27 76] 三趟归并 [13 27 38 49 65 76 97]

8.6 基数排序 采用“分配”与“收集”的办法。 假设待排序数据序列的关键字K拆分成m个位: (K0,K1,…,Km-2,Km-1。

1、最高位优先法 按Km-1对序列排序,再按Km-2对序列排序,依次重复,最后K0对序列排序。 2、最低位优先法 按K0对序列排序,再按K1对序列排序,依次重复,最后按Km-1对序列排序。

基数排序的“分配”与“收集”过程 第一趟 614 738 921 485 637 101 215 530 790 306 第一趟分配(按最低位 i = 3 ) re[0] re[1] re[2] re[3] re[4] re[5] re[6] re[7] re[8] re[9] 790 101 215 530 921 614 485 306 637 738 fr[0] fr[1] fr[2] fr[3] fr[4] fr[5] fr[6] fr[7] fr[8] fr[9] 第一趟收集 530 790 921 101 614 485 215 306 637 738

基数排序的“分配”与“收集”过程 第二趟 530 790 921 101 614 485 215 306 637 738 第二趟分配(按次低位 i = 2 ) re[0] re[1] re[2] re[3] re[4] re[5] re[6] re[7] re[8] re[9] 738 306 215 637 101 614 921 485 790 530 fr[0] fr[1] fr[2] fr[3] fr[4] fr[5] fr[6] fr[7] fr[8] fr[9] 第二趟收集 101 306 614 215 921 530 637 738 485 790

基数排序的“分配”与“收集”过程 第三趟 101 306 614 215 921 530 637 738 485 790 第三趟分配(按最高位 i = 1 ) re[0] re[1] re[2] re[3] re[4] re[5] re[6] re[7] re[8] re[9] 637 790 101 215 306 485 530 614 738 921 fr[0] fr[1] fr[2] fr[3] fr[4] fr[5] fr[6] fr[7] fr[8] fr[9] 第三趟收集 101 215 306 485 530 614 637 738 790 921

算法分析 假设每个数据的关键字位数为d,每个关键字的取值范围为rd个非负整数,时间复杂度为O(d(n+rd)),其中每趟分配的时间复杂度为O(n),每趟收集的时间复杂度为O(rd),整个排序过程需要d趟分配与收集。另外,需要2rd个队列指针的辅助空间,由于采用链式存储结构,故还增加了n个指针域的空间。

8.7 各类排序方法的比较 性能: 时间复杂度和空间复杂度。 8.7 各类排序方法的比较 性能: 时间复杂度和空间复杂度。 对于时间复杂度为O(n2)的简单排序方法(包括直接插入排序法、折半插入排序法、简单选择排序法、冒泡排序法等)适用于待排序数据序列长度较小的情况,当待排序数据序列长度较大时,则应该使用希尔排序、快速排序或堆排序等。

8.8 外部排序 当待排序的对象数目特别多时,在内存中不能一次处理。必须把它们以文件的形式存放于外存,排序时再把它们一部分一部分调入内存进行处理。排序过程中不断地在内存与外存之间传送数据。

外排序的基本过程: 当对象以文件形式存放于磁盘上的时候,通常是按物理块存储的。 物理块也叫做页块,是磁盘存取的基本单位。 每个页块可以存放几个对象。操作系统按页块对磁盘上的信息进行读写。

结 束!