- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
排序算法(第八章)
8.1 概述 8.2 插入排序 8.3 交换排序 8.4 选择排序 8.5 基数排序 8.6 归并排序 8.7 各种内排方法比较 8.1 概 述 排序(sorting):是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。 数据表(datalist): 它是待排序数据对象的有限集合。 主关键字(key): 数据对象有多个属性域, 即多个数据成员组成, 其中有一个属性域可用来区分对象, 作为排序依据,称为关键字。也称为排序码。 排序方法的稳定性: 如果在对象序列中有两 个对象r[i]和r[j], 它们的排序码 k[i] == k[j] , 且在排序之前, 对象r[i]排在r[j]前面。如果在排序之后, 对象r[i]仍在对象r[j]的前面, 则称这个排序方法是稳定的, 否则称这个排序方法是不稳定的。 如待排序列:49,38,65,97,76,13,27,49 使用直接插入排序得到的序列: 13,27,38, 49,49,65,76,97 内排序与外排序。由于待排序的记录数量不同,使得排序过程中涉及的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录全部存放在计算机存储器中进行的排序过程;另一类是外部排序,指的是待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中需对外存进行访问的排序过程。 排序的时间开销:排序的时间开销是衡量算法好坏的最重要的标志。排序的时间开销可用算法执行中的数据比较次数与数据移动次数来衡量。 内部排序分类(依不同原则分): 插入排序、交换排序、选择排序、归并排序、和基数排序等。 排序过程的基本操作: 比较两个关键字的大小 将记录从一个位置移动到另一个位置 待排序记录序列的存储方式: 地址连续的一组存储单元(记录之间的次序关系由存储位置决定,实现排序必须借助移动记录) 链表(记录之间的次序关系由指针指示,实现排序不需要移动记录,仅需修改指针) 地址连续的一组存储单元,另设一个指示各个记录存储位置的地址向量,在排序过程中不移动记录本身,而移动地址向量中的地址,在排序之后再按照地址向量中的值调整记录的存储位置--地址排序 (本章使用第一种存储方式) 待排记录的数据类型定义 # define MAXSIZE 20 //顺序表长度 typedef int KeyType; //为方便起见,本章中关键字均设为整型 typedef struct { KeyType key; InfoType otherinfo; }RedType; //记录类型 typedef struct { RedType r[MAXSIZE+1]; //0号单元用作监视哨,控制比较是否结束;或存放当前需排序的元素 int length; }SqList; //顺序表类型 8.2 插入排序 (Insert Sorting) 1. 直接插入排序 (Insert Sort): 又称“线性插入排序”,是一种最简单的排序方法。 基本思想:当插入第i (i 1) 个对象时, 前面的r[1], r[2], …, r[i-1]已经排好序。这时, 用r[i]的关键字与r[i-1], r[i-2], …的关键字进行比较, 找到插入位置即将r[i]插入, 原来位置上的对象向后顺移。 算法分析 设待排序对象个数为 n, 则该算法的主程序执行n-1趟。 关键字比较次数以及对象移动次数与初始序列关键字的排列有关。 最好情况下, 排序前对象已按关键字从小到大有序, 每趟只需与前面有序对象序列的最后一个对象比较1次, 总的关键字比较次数为 n-1, 不需移动记录。 最坏情况下,待排记录按关键字非递增有序排列(逆序)时,第 i 趟时第 i+1 个对象必须与前面 i 个对象都做关键字比较, 并且每做1次比较就要做1次数据移动。总比较次数为(n+2)(n-1)/2次,总移动次数为(n+4)(n-1)/2。 在平均情况下的关键字比较次数和对象移动次数约为 n2/4。因此,直接插入排序的时间复杂度为 O(n2)。 直接插入排序是一种稳定的排序方法。 2. 折半插入排序 (Binary Insertsort): 基本思想:既然每个待插入记录之前的记录已经按关键字有序排列,在查找插入位置时就没有必要逐个关键字比较,可以使用折半查找来实现。由此进行的插入排序称之为折半插入排序。 折半插入排序 折半搜索比顺序搜索查找快, 所以折半插入排序就平均性能来说比直接插入排序要快。 它所需的关键字比较
原创力文档


文档评论(0)