- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构与算法7讲解
;;;1. 排序算法的适用范围
直接插入排序、简单选择排序和冒泡排序都是简单排序算法,它们的时间复杂度和空间复杂度分别为O(n2)和O(1)。若待排序元素数量n较小,可以选用直接插入排序和冒泡排序。另外,当待排序元素基本有序时,也应选用直接插入排序和冒泡排序,此时时间复杂度都能达到O(n)。若元素本身数据量较大,元素移动操作代价较高,则应选用平均移动元素次数最少的简单选择排序。希尔排序是对直接插入排序算法的改进,大大降低了时间复杂度,但它是一种不稳定的排序算法。;堆排序、快速排序和归并排序主要适用于待排序元素数量n较大的情况,当待排序元素数量n较小时,它们的性能有可能劣于简单排序算法。在所有平均时间复杂度为O(nlog2n)的算法中,尽管快速排序在最坏情况下时间复杂度较高,但它通常被认为是平均性能最好的一种算法。归并排序是一种稳??的排序算法,其时间性能一般要优于堆排序,但它所需要的辅助空间较多,堆排序所需的辅助空间最少,当可用空间非常有限时可以考虑使用。
箱排序和基数排序的时间复杂度最低,但它们的空间复杂度最高。箱排序主要适用于待排序元素长度(即d值)较小的情况,在实际中应用不多;基数排序是箱排序的改进,主要适用于整数或字符串的排序,或者与其他排序算法结合进行实数的排序。;2. 排序算法的复杂度
下面对各类排序算法的性能作一下比较。设待排序元素数目为n、待排序元素的长度为d、待排序元素每一位可能取值的个数为rd(例如,待排序元素为至多4位的整数,此时d=4、rd=10;再如,待排序元素为长度至多为20的字符串、每一字符取值为a~z,此时d=20、rd=26),则各排序算法的性能如表7-1所示。
;;7.2 插入排序 ;直接插入排序是一种简单排序算法,其具体步骤为:
初始已排序区为空,将第一个待排序的元素插入到已排序区中。将后继每一个待排序的元素依次取出,并按照关键字大小将其插入到已排序区中的适当位置,使该序列仍然有序。重复上一步骤直至将待排序的元素都插入到已排序序列中。
;直接插入排序的算法描述如下:
【描述7-1】直接插入排序的算法描述。
分析:从图7-1中可见,已排序元素数目与待排序元素数目之和保持不变,因此,可以使用同一个数组的不同部分分别保存已排序序列和未排序元素集合。如定义一个一维数组R,在第i趟排序后R中下标为1到i+1的位置用于存放已排序序列、之后的位置用于存放未排序元素集合。
;7.2 插入排序 ;;7.2 插入排序 ;;;7.3 选择排序 ;7.3 选择排序 ;7.3 选择排序 ;7.3 选择排序 ;;;;7.3 选择排序 ;在将一棵R[i]作为根结点的子树整理为堆时,只有根结点不满足堆的条件,因此,需将根结点与后继层中的结点依次比较并不断将根结点下移直至该子树满足堆的条件,这里以大根堆构建为例介绍其具体过程:
若R[i]存在左孩子R[2*i],则令j=2*i;若R[i]存在右孩子R[2*i+1]且R[2*i+1]R[2*i],则令j=2*i+1。将R[j]与R[i]比较,若R[i]较小,则将R[i]和R[j]交换,并令i=j。
重复上述步骤直至R[i]无孩子结点或R[i]比其孩子结点都大,此时该子树即为堆。
例如,对于图7-5所示的大根堆构建过程,图7-5(c)到图7-5(d)的作用是将整棵树整理为堆,其具体步骤为:将根结点R[1]与具有较大值的右孩子结点R[3]比较,有R[1]R[3],因此将R[1]和R[3]交换;将R[3]与左孩子结点R[6]比较(左右孩子同样大时以左孩子结点优先),有R[3]R[6],因此将R[3]和R[6]交换;R[6]无孩子结点,此时该树已整理为堆。 ;3.堆排序算法
下面给出堆排序的具体过程:
采用自底向上的方法将包含n个元素的待排序集合R={R[1], R[2], …, R[n]}整理为大根堆,其元素数目i=n,初始时已排序集合R为空集;
将R[1]与R[i]交换,并将i算作已排序集合中的元素位置,更新待排序集合中最后一个元素的位置i=i-1,此时待排序集合R={R[1], R[2], …, R[i]},已排序集合R={R[i+1], R[i+2], …, R[n]}。显然,待排序集合R={R[1], R[2], …, R[i]}中只有根结点R[1]不满足大根堆的条件,通过下移R[1]重新将R整理为大根堆;
重复上一步骤直至待排序集合R={R[1]},此时直接将R[1]作为已排序集合R中的元素,堆排序过程结束。 ;例如,对于集合{30, 22, 37, 17, 28, 37, 56, 43},其堆排序过程如图7-6所示。可见,这里给出的堆排序选择元素的顺序与前面给出的简单选择排序正好相反,每轮堆排序从待排序集合中选择最大元素并将其放到已排序集合的头部。
您可能关注的文档
最近下载
- 高中英语-The-Best-Medicine教学课件设计.ppt VIP
- 旅游景区游客踩踏事故应急预案.doc VIP
- 鲜水葫芦与其汁液厌氧发酵产沼气效率比较.pdf VIP
- 文物数字化保护系统解决方案.pdf VIP
- 民事诉讼法题库.pdf VIP
- MBN_LV_124-2_2013-08 电子和电气零部件测试要求,第二部分:环境要求.pdf VIP
- MBN_LV_124-1_2013-03 12V车载电子系统电气要求和测试.pdf VIP
- 初中化学课堂教学情境的创设教育论文.docx VIP
- 2023年林芝市高级技工学校工作人员招聘考试试题2.docx VIP
- 医保定点医疗机构准入标准.doc VIP
文档评论(0)