资源简介 (共16张PPT)选择排序算法知识回顾:选择排序的基本思想在参加排序的数组的所有元素中找出_______(或最大)的数据,使它与________ 元素(左端)中的数据相互交换位置,然后在余下的元素中找出最小(或最大)的数据,与第二个元素中的数据相互交换位置。以此类推,直到所有元素成为一个有序的序列。最小知识回顾:选择排序的基本思想最小第一个例1:已知数组a的初始值[5,9,3,8,1,2],采用选择排序算法对其进行从小到大排序。请写出每一趟排序后数组a的值。1,9,3,8,5,21,2,3,8,5,91,2,3,8,5,91,2,3,5,8,91,2,3,5,8,9如何找到最小数呢?还记得我们找到全班最高的同学的例子吗?假设,我们把全班同学的身高都放在数组a()中,如何找到最高的那位同学max?如果要找到的是最小数的位置k呢?5 9 3 8 1 2数组a0412350下标假设第一个人身高是最高的与后面的所有数进行比较k=jjk比它大就跳到它的位置上5 9 3 8 1 2数组a0412350下标通过变量描述选择排序的执行过程:i表示轮次 k初值 j表示数组下标 比较次数 本轮结果01、2、3、4、551,9,3,8,5,212、3、4、541,2,3,8,5,923、4、531,2,3,8,5,934、521,2,3,5,8,94511,2,3,5,8,901234一、程序实现冒泡排序:for i in range(_________):len(a)-1for j in range(_____,_________):len(a)i+1if a[j]k=______程序语言的核心不是背代码,而是理解算法?k=____ijif k!=i:a[i],a[k]=a[k],a[i]说明k跳过把a[i],a[k]=a[k],a[i]改成a[i],a[j]=a[j],a[i]可以吗?选择排序小结:n个数需要经过n-1轮才能完成整个排序过程。比较次数:(n-1)+(n-2)+(n-3)……+1=n*(n-1)/2交换次数为:0~n-1找到最大的数,j的变化范围是从[i+1,n),可不可以写成[n-1,i)呢?如果是从后往前选择排序,代码该如何写呢?思维拓展:二、读代码例2:有如下python程序段for i in range(4):k=ifor j in range(i+1,len(a)):if a[j]k=jif k!=i:a[i],a[k]=a[k],a[i]f(i) = True当数组元素a的值依次为“8,2, 1,21,3”,数组f的初值均为False,执行该程序段,f数组中元素值为True的个数有( )A.1个 B.2个 C.3个 D.4个外循环控制轮次,n个元素进行了n-1轮循环,说明已完成排序如果遇到更小的数,跳到它的位置上将小的数换到前面C二、读代码例3:有如下python程序段a=list(“welcome to my class”)for i in range(len(a)-1):k=ifor j in range(i+1,len(a)):if a[j]k=jif k!=i:a[i],a[k]=a[k],a[i]则程序运行结束后,变量count的值是( )A.7 B.8 C.9 D.10a=””.join(a)count=0for i in range(len(a)-1):if a[i]==a[i+1]:conut+=1A提效方法:当我们判定好代码语句后,就已经知道排序的结果了,不需要一步一步执行过程三、选择排序的优化双向排序指的是在参加排序的所有元素中,同时选出最小值和最大值,分别交换到左、右边界,再缩小左右边界。当选择排序某一轮没有交换时,并不能表示排序已经完成。我们可以通过两头双向排序来优化代码。高考题改编L,R=0,len(a)-1while Limin=imax=Lfor i in range(L+1,R+1):if a[i]>a[imax]:imax=ielif a[i]imin=ia[imin],a[L]=a[L],a[min]if imax==L:imax=_____a[imax],a[L]=a[L],a[imax]L=L+1R=R-13,1,2,8,58,1,2,3,5imin6.【台州】有如下VB程序段:a(1)=3:a(2)=8:a(3)=9:a(4)=5:a(5)=6:a(6)=1n=6m=int(rnd*3)*2+1for i=m to 5k=ifor j=6 to i+1 step -1if a[j]next jtmp=a[k):a(k)=a(i):a(i)=tmpnext i该程序段执行后,a(1)~a(6)个元素不可能的是( )A.1,3,5,6,8,9 B.3,1,5,6,8,9 C.3,8,1,5,6,9 D.3,8,9,5,1,6B考察:m的变化与排序区域7.【2019.6舟山】有如下程序段:n=6m=int(rnd*6+1)for i=1 to n-mk=ifor j=m to n-iif a(j)>a(j+1) thent=a(j):a(j)=a(j+1):a(j+1)=telseif a(j)>a(k) thenk=jendifnext jtmp=a(k):a(k)=a(i):a(i)=tmpnext i数组元素a(1)到a(6)的值依次为“2,77,82,71,5,42”。经过该程序段加工后,数组元素 a(1)到a(6)的值不可能是 ( )A.2,5,42,71,82,77 B.5,77,82,71,2,42C.2,77,42,5,71,82 D.2,77,82,5,42,71本节课小结回顾冒泡排序的基本思想,并基于基本思想完成代码的编写通过i,j变化了解此类题型解题的一般方法通过引入变量对冒泡排序进行优化谢谢 展开更多...... 收起↑ 资源预览