版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
5.3.2选择排序第一次排序第二次排序第三次排序第四次排序任务完成!选择排序的基本思想是第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后从剩余的未排序元素中找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。在参加排序数组的所有元素中找出最小(或最大)数据的元素,使它与第一个元素中的数据交换位置,然后在余下的元素中找出最小(或最大)数据的元素,与第二个元素中的数据交换位置。以此类推,直到所有元素成为一个有序的序列。以四个数据21,99,16,67为例,升序(从小到大)选择排序的过程如图所示:21991667原始数据123421991667第1次比较j=2k=1比较后,k=121991667第2次比较k=1j=3比较后,k=321991667第3次比较k=3j=4比较后,k=3并交换选择排序第一遍排序16992167第一遍排序后的结果123416992167第1次比较k=2j=3比较后,k=3第2次比较16992167k=3j=4比较后,k=3并交换选择排序第二遍排序162199671234第二遍排序后的结果第1次比较16219967k=3j=4比较后,k=3并交换选择排序第三遍排序162167991234第三遍排序后的结果数据已经有序,完成排序!选择排序算法对规模为n的数据进行排序,总共需要进行n-1遍加工。
在选择排序的每一遍操作中,最多需要进行一次交换,当某一遍的最小(或最大)数据元素的位置就在排序数组最前面时,不需要进行交换。即最坏情况下需要交换n-1次,最好情况下(排序元素已经有序)需要交换0次。选择排序的程序实现如下:a=[12,25,33,10,15]n=len(a)foriinrange(n-1):min_idx=i#记录最小值的索引forjinrange(i+1,n):ifa[j]<a[min_idx]:min_idx=j#更新索引ifmin_idx!=i:#判断是否需要交换位置a[min_idx],a[i]=a[i],a[min_idx]print(a)选择排序的迁移应用一a=[12,25,33,10,15]n=len(a)foriinrange(n-1):min_idx=i#记录最小值的索引forjinrange(n-1,i,-1):ifa[j]<a[min_idx]:min_idx=j#更新索引ifmin_idx!=i:#判断是否需要交换位置a[min_idx],a[i]=a[i],a[min_idx]print(a)迁移原理:将比较的顺序修改为从后往前,每一遍循环中变量min_idx还是在记录排序范围中最小数据的元素索引。选择排序的优化在数组的所有元素中同时找出最小的元素和最大的元素,然后将这两个元素分别与第一个和最后一个元素交换,在余下的元素中再找出最小和最大数据的元素,分别与第二个和倒数第二个元素交换,依次类推,直到所有元素的数据按升序排列,这就是选择排序的优化。代码如下:a=[31,69,55,23,18,57,90,82,97,27]n=len(a)p=0q=9whilep<=q:iMin=piMax=pforiinrange(p+1,q+1):ifa[i]<a[iMin]:iMin=iifa[i]>a[iMax]:iMax=ia[iMin],a[p]=a[p],a[iMin]ifiMax==p:iMax=iMina[iMax],a[q]=a[q],a[iMax]p=p+1q=q-1print(a)
优化原理:从两端往中间同时进行,一端从小到大排,一端从大到小排,变量p和q表示本次排序的范围(p前和q后的数据已经完成排序)。for语句找出本次排序的最小数组元素a[iMin]和最大数组元素a[iMax],然后将a[iMin]与a[p]交换,将a[iMax]与a[q]交换。冒泡排序选择排序选择排序算法原理一边比较,一边交换先选出最大值或最小值的索引,再交换先选出最大值或最小值的索引,再交换核心代码foriinrange(1,n):forjinrange(n-1,i-1,-1):ifa[j]<a[j-1]:a[j],a[j-1]=a[j-1],a[j]foriinrange(1,n):k=i-1forjinrange(i,n):ifa[j]<a[k]:k=jifk!=i-1:
a[i-1],a[k]=a[k],a[i-1]foriinrange(1,n):k=i-1forjinrange(i,n):ifa[j]<a[k]:k=jifk!=i-1:
a[i-1],a[k]=a[k],a[i-1]相同点①n个数都需要n-1遍排序,其中变量i控制排序的遍数;②比较的次数一样多,都是n*(n-1)/2;③最好的情况下,交换的次数一样,都是0不同点边比较边交换,最坏的情况下交换的次数是n*(n-1)/2先选择再交换,最坏的情况下交换的次数是n-1如何区分因为是边比较边交换,所以交换的代码是在内层循环里面的因为是先选出最大值或最小值再交换,所以交换的代码在内层循环的外面练一练1.有如下Python程序段:a=[52,36,68,79,27]n=len(a)b=0c=0foriinrange(n-1):k=iforjinrange(i+1,n):ifa[j]<a[k]:k=jb=b+1ifk!=i:a[i],a[k]=a[k],a[i]c=c+1print(b,c)该程序段执行后,b和c的值分别为()A.53B.44C.43D.34C2.某排序算法的Python程序段如下:a=[18,12,11,21,13]n=len(a)f=[False]*5#含有5个元素,且初始值为False的列表foriinrange(n):k=iforjinrange(n-1,i,-1):ifa[j]<a[
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Photoshop一级考试试题(含详细答案解析)
- 体育馆室内装饰装修施工方案
- PDP性格测试完整版(试题+详细解析答案)
- 2026年演出经纪人考试题库附参考答案(典型题)
- 2026年河北省机关事业单位工人技能等级考试(木材检验工)历年参考题库及答案
- 草酸钙尿路结石长期饮水预防方案共识
- Oracle 基础知识笔试试题及详细答案
- 2026年普法知识竞赛题库及答案
- 2026年注册安全工程师专业技术能力评估试题(附答案)
- 室外游乐设施防冻运维规程
- 瑞幸咖啡门店工作制度
- 工业铸造行业分析报告
- 2026浙江宁波市余姚市阳明街道办事处招聘编外工作人员1人笔试参考题库及答案解析
- 飞行员心理培训课件
- T∕TCMCA 0035-2025 十字轴式万向联轴器 验收规范
- 制药配液系统培训
- 光缆开剥与固定课件
- 儿童内分泌科进修汇报
- (正式版)DB2327∕T 049-2022 《大兴安岭地区生态产品总值(GEP)核算指南与技术办法》
- T-CIFST 027-2025 预制菜生产技术规范
- 重度脱水急救规范流程
评论
0/150
提交评论