- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
知 识 点 排序的基本概念 三种简单的排序方法:冒泡排序、直接选择排序、简单插入排序 堆排序 快速排序 归并排序 基数排序 难 点 堆排序 快速排序 归并排序 基数排序 要 求 熟悉各种内部排序方法的基本思想和特点 各种排序方法的优缺点、时、空性能和适用场合 熟悉并掌握三种简单排序算法、快速排序算法和堆排序算法 熟悉二路归并排序算法 熟悉基数排序算法 第10章 内部排序 10.1 概述 10.2 插入排序 10.3 快速排序 10.4 选择排序 10.5 归并排序 10.6 基数排序 10.7 比较讨论10.8 外部排序 10.1 概述 将一组杂乱无序的数据元素按一定的规律顺次排列起来叫做排序(sort)。 对一批记录的排序,应该指定是根据记录中哪个域的数据进行排列。这个作为排序依据的数据域我们称之为关键字(key)。 本章讨论的排序均为按递增顺序排序,并假定要排序的记录均已存储在一个一维数组中。 #define MAXSIZE 20 typedef int KeyType; typedef struct {KeyType key; /*关键字*/InfoType otherinfo; /*其他域*/ }RedType; 大多数的排序方法数据是存储在内存中,并在内存中加以处理的,这种排序方法叫内部排序。 如果在排序过程中,数据的主要部分存放在外存储器中(如软盘、硬盘、磁带),借助内存进行内、外存数据交换,逐步排列记录之间的顺序,则称之为外部排序。 一种排序方法,如果排序后具有相同关键字的记录仍维持排序之前的相对次序,则称之为稳定的,否则称为不稳定的。 插入排序 将无序子序列中的一个或几个记录“插入”到有序序列中,从而增加记录的有序子序列的长度; 交换排序 通过“交换”无序序列中的记录从而得到其中关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列的长度; 选择排序 从记录的无序子序列中“选择”关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列的长度; 归并排序 通过“归并”两个或两个以上的记录有序子序列,逐步增加记录有序序列的长度; 其它方法 二叉排序树等 10.2 插入排序 10.2.1 直接插入排序 10.2.2 折半插入排序 10.2.3 希尔排序 10.2.1 直接插入排序 直接插入排序的基本思想是:从数组的第二个单元开始,依次从原始数据中取出数据,并将其插入到数组中该单元之前的已排好序的序列中合适的位置处。 直接插入算法需要经过(n-1)趟插入过程。如果数据恰好应插入到序列的最后端,则不需移动数据,可节省时间,所以若原始数据大体有序,此算法可以有较快的运算速度。 显然,完成这个“插入”需分三步进行: 1.查找R[i]的插入位置j+1;(j+1i) 2.将R[j+1..i-1]中的记录后移一个位置; 3.将R[i]复制到R[j+1]的位置上。 直接插入排序算法的三个要点: 1.从R[i-1]起向前进行顺序查找,监视哨设置在R[0];R[0] = R[i]; // 设置“哨兵” 2.对于在查找过程中找到的那些关键字不小于R[i].key的记录,并在查找的同时实现记录向后移动;for (j=i-2; R[0].keyR[j].key; --j)R[j+1] = R[j]; 3.插入到正确位置 R[j+1]=r[0] 4. i=2,3,4,……n 实现整个序列的排序。 void InsertionSort ( Elem R[ ], int n) { // 对记录序列R[1..n]作直接插入排序。 for ( i=2; i=n; ++i ) {R[0] = R[i]; // 复制为监视哨for ( j=i-2; R[0].key R[j].key; --j )R[j+1] = R[j]; // 记录后移R[j+1] = R[0]; // 插入到正确位置 } } // InsertSort 10.2.2 折半插入排序 若R[1..i-1]是一个按关键字有序的有序序列,则可以利用折半查找实现“在R[1..i-1]中查找R[i]的插入位置”,如此实现的插入排序为折半插入排序。 折半插入排序算法 void BiInsertionSort (Elem R[ ], int n) {// 对记录序列R[1..n]作折半插入排序。 for ( i=2; i=L.length; ++i ) { R[0] = R[i]; // 将R[i]暂存到R[0]low = 1; high = i-1;while (low=high){ //在R[low..high]中折半查找插入的位置m = (low+high
您可能关注的文档
最近下载
- 英语语法大全-英语语法大全.pdf VIP
- 合信MagicWorks HMI用户手册V3.00.pdf
- 《股骨远端骨折教学》.ppt VIP
- 天然气制氢简介演示.ppt VIP
- 学堂在线 日语与日本文化 期末考试答案.docx VIP
- 北师大版八年级数学下册专题10分式方程应用的三种考法全攻略(原卷版+解析).docx VIP
- ppt素材大全.ppt VIP
- 人教版八年级数学上册专题10分式方程实际应用压轴题的四种考法全攻略(原卷版+解析).docx VIP
- 2025年铁路轨道参数动态检测装置项目市场调查研究报告.docx
- 人教版八年级数学上册专题08因式分解压轴题的四种考法(原卷版+解析).docx VIP
文档评论(0)