- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3、直接插入排序示例 前面所给例子的直接插入排序过程如图9.1所示。 直接插入排序的时间性能分析 直接插入排序的时间性能分析 直接插入排序的性能分析 空间性能:需要一个记录的辅助空间。 直接插入排序算法是一种稳定的排序算法。 直接插入排序算法简单、容易实现,适用于待排序记录基本有序或待排序记录较小时。 当待排序的记录个数较多时,大量的比较和移动操作使直接插入排序算法的效率降低。 如何改进直接插入排序? 希尔排序 对直接插入排序进行改进 改进的着眼点: (1)若待排序记录按关键码基本有序时,直接插入排序的效率可以大大提高; (2)由于直接插入排序算法简单,则在待排序记录数量n较小时效率也很高。 希尔排序 基本思想:将整个待排序记录分割成若干个子序列,在子序列内分别进行直接插入排序,待整个序列中的记录基本有序时,对全体记录进行直接插入排序。 需解决的关键问题? (1)应如何分割待排序记录,才能保证整个序列逐步向基本有序发展? (2)子序列内如何进行直接插入排序? 希尔排序 分割待排序记录的目的? 1. 减少待排序记录个数; 2. 使整个序列向基本有序发展。基本有序:例如{1, 2, 8, 4, 5, 6, 7, 3, 9};局部有序:例如{6, 7, 8, 9, 1, 2, 3, 4, 5}。局部有序不能提高直接插入排序算法的时间性能。 启示? 子序列的构成不能是简单地“逐段分割”,而是将相距某个“增量”的记录组成一个子序列。 希尔插入排序过程示例 问题1:应如何分割待排序记录? 解决方法: 将相隔某个“增量”的记录组成一个子序列。 增量应如何取? 希尔最早提出的方法是d1=n/2,di+1=di/2。 问题2:子序列内如何进行直接插入排序? 解决方法: 在插入记录r[i]时,自r[i-d]起往前跳跃式(跳跃幅度为d)搜索待插入位置,并且r[0]只是暂存单元,不是哨兵。当搜索位置<0,表示插入位置已找到。 在搜索过程中,记录后移也是跳跃d个位置。 在整个序列中,前d个记录分别是d个子序列中的第一个记录,所以从第d+1个记录开始进行插入。 希尔排序算法的时间性能 希尔排序开始时增量较大,每个子序列中的记录个数较少,从而排序速度较快;当增量较小时,虽然每个子序列中记录个数较多,但整个序列已基本有序,排序速度也较快。 希尔排序算法的时间性能是所取增量的函数,而到目前为止尚未有人求得一种最好的增量序列。 研究表明,希尔排序的时间性能在O(n2)和O(nlog2n)之间。当n在某个特定范围内,希尔排序所需的比较次数和记录的移动次数约为O(n1.3 ) 。 冒泡排序的时间性能分析 最好情况(正序): 比较次数:n-1 移动次数:0 时间复杂度为O(n)。 冒泡排序的时间性能分析 冒泡排序的性能分析 在平均情况下,冒泡排序的时间复杂度与最坏情况同数量级。 冒泡排序只需要一个记录的辅助空间,用来作为记录交换的暂存单元。 冒泡排序是一种稳定的排序方法。 冒泡排序的改进思考 9.3.2 交换排序(快速排序) 首先选一个轴值(即比较的基准),通过一趟排序将待排序记录分割成独立的两部分,前一部分记录的关键码均小于或等于轴值,后一部分记录的关键码均大于或等于轴值,然后分别对这两部分重复上述方法,直到整个序列有序。 需解决的关键问题: ⑴如何选择轴值? ⑵如何实现分割(称一次划分)? ⑶如何处理分割得到的两个待排序子序列? ⑷如何判别快速排序的结束? 问题1:如何选择轴值? 选择轴值的方法: 1.使用第一个记录的关键码; 2.选取序列中间记录的关键码; 3.比较序列中第一个记录、最后一个记录和中间记录的关键码,取关键码居中的作为轴值并调换到第一个记录的位置; 4.随机选取轴值。 选取不同轴值的效果: 决定两个子序列的长度,子序列的长度最好相等。 问题2:如何实现一次划分? 解决方法: ① 取第一个记录的关键字值作为基准,将第一个记录暂存于temp中,设两个变量i,j分别指示将要划分的最左、最右记录的位置。 ② 将j指向的记录关键字值与基准值进行比较,如果j指向的记录关键字值大,则j前移一个位置;重复此过程,直到j指向的记录关键字值小于基准值;若ij,则将j指向的记录移到i所指位置。 ③ 将i指向的记录关键字值与基准值进行比较,如果i指向的记录关键字值小,则i后移一个位置;重复此过程,直到i指向的记录关键字值大于基准;若ij,则i指向的记录移到j所指位置。 ④ 重复②、③步,直到i=j。 3、快速排序示例 例如,设待排序区间为R[0]到R[7],8个记录分别为:(36,73,65,97,13,27,36`,29),按照取第一个记录作为基准进行一次划分的过程如图9.5所示。图中方括号表示无序区
文档评论(0)