资源简介 (共28张PPT)知识回顾迭代算法:利用计算机运算速度快、适合做重复性操作的特点,让计算机重复执行一组指令,这组指令每执行一次时,都会将变量从原值递推出一个新值,即由旧值不断推出新值的过程。f1 = 1f2 = 1i = 3while i <= 12:f = f1 + f2f1 = f2f2 = fi += 1print(f"第{i-1}月共有{f}对兔子“)迭代算法处理问题:确定迭代变量:由旧值递推出新值的变量;建立迭代关系式:从变量的前值推出下个值的公式;控制迭代条件:经过若干次重复执行后能够结束。知识回顾递归算法:在计算机科学中,指一种通过重复将问题分解为同类的子问题而解决问题的方法,它通过函数自己调用自己来实现,即一个函数在其定义中直接或间接调用自身的一种方法。核心思想:把大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,规模较小的又转化为规模更小的问题求解,当问题小到一定程度时,可以直接得出它的解,从而回归求解问题原来的解。即“大事化小,小事化了”的思想。实现条件:1、每一步解决问题的方法有一致的规律:递归公式2、可以达到某个边界条件:递归出口CHZX5.3 数据排序浙江省高中信息技术 选择性必修一 《数据与数据结构》昌化中学 应彤鑫冒泡排序算法思想程序实现01冒泡排序Maopao paixu算法思想冒泡排序Maopao paixu算法思想是一系列数据中对相邻两个数依次进行比较和调整,让较大的数“下沉(上冒)”,较小的数“上冒(下沉)”的一种排序技术。三 要 素趟数:n个数最多排 趟就完全有序方向:从前往后、从后往前升降:升序、降序n-1冒泡排序Maopao paixu算法实践原始数据 170 176 165 183 162 比较次数 交换次数第一趟 排序第二趟 排序第三趟 排序第四趟 排序170165176162183421651701621761833216516217017618321162165170176183114+3+2+1=102+2+1+1=6总比较次数:总交换次数:冒泡排序Maopao paixu算法实践原始 数据 170 176 165 183 162 比较次数 交换次数第一趟第二趟第三趟第四趟原始 数据 170 176 165 183 162 比较次数 交换次数第一趟第二趟第三趟第四趟原始 数据 170 176 165 183 162 比较次数 交换次数第一趟第二趟第三趟第四趟原始 数据 170 176 165 183 162 比较次数 交换次数第一趟第二趟第三趟第四趟①从前往后 升序②从前往后 降序③从后往前 升序④从后往前 降序170 165 176 162 183 4 2165 170 162 176 183 3 2165 162 170 176 183 2 1162 165 170 176 183 1 1176 170 183 165 162 4 2176 183 170 165 162 3 1183 176 170 165 162 2 1183 176 170 165 162 1 0162 170 176 165 183 4 4162 165 170 176 183 3 2162 165 170 176 183 2 0162 165 170 176 183 1 0183 170 176 165 162 4 3183 176 170 165 162 3 1183 176 170 165 162 2 0183 176 170 165 162 1 0练一练有一组数为:6,2,9,8,7,4,经过一趟冒泡排序后的序列为:2,6,4,9,8,7,第二趟排序后的序列是( )A.2,6,7,4,8,9 B.2,6,4,7,8,9C.2,4,6,7,9,8 D.2,4,6,7,8,9C冒泡排序Maopao paixu程序实现——从前往后的升序for j in range(______________):If ____________________ :for i in range(______________):temp=a[j]a[j]=a[j+1]a[j+1]=tempa[j]>a[j+1]①如果符合条件,实现相邻两数交换②每一趟升降的控制当后者比前者小(升序)③每一趟比较方向及次数的控制④处理的趟数的控制1 ,n0,n-i冒泡排序Maopao paixu程序变式——从前往后的降序?for j in range(______________):If ____________________ :for i in range(______________):temp=a[j]a[j]=a[j+1]a[j+1]=tempa[j]>a[j+1]①如果符合条件,实现相邻两数交换②每一趟升降的控制当后者比前者小(升序)③每一趟比较方向及次数的控制④处理的趟数的控制1 ,n0,n-ia[j]练一练有如下一段代码a=[6,2,8,4,3,7]length=len(a)for i in range(1,length):for j in range(0,length-i):if a[j]>a[j+1]:temp=a[j]a[j]=a[j+1]a[j+1]=tempprint(a)Q1:这段代码实现的是冒泡排序算法,根据代码可知排序 (选填:从前往后或从后往前)的 (选填:升序/降序)。Q2:代码运行结果为 。其中第二趟排序结果为 。从前往后升序[2,3,4,6,7,8][2,4,3,6,7,8]冒泡排序Maopao paixu自定义函数的使用对于需要重复调用的冒泡排序算法,我们可以创建自定义函数bubble_sort()来实现def bubble_sort(a):n=len(a)for i in range( 1 ,n ):for j in range( 0,n-i ):if a[j]>a[j+1]:temp=a[j]a[j]=a[j+1]a[j+1]=temp使用方法:a=[3,1,9,7,6]bubble_sort(a)print(a)运行结果:[1,3,6,7,9]练一练运行以下Python程序段后,输出的列表为( )def bubble_sort(L):length=len(L)for i in range(1,3):for j in range(length,i,-1):if L[j]temp=L[j]L[j]=L[j-1]L[j-1]=tempa=[6,8,2,4,3,7]bubble_sort(a)print(a)A.[2,3,4,6,7,8] B.[8,7,6,4,3,2]C.[2,3,4,6,8,7] D.[2,3,6,8,4,7]D冒泡排序Maopao paixu冒泡排序的程序优化优化:观察排序过程,可以发现第三趟冒泡排序后数组已经有序,后面两趟排序实际上没有做任何交换操作,因此可以设置一个标记变量flag来标记某趟排序过程中是否发生了交换。若无交换操作,表示已经完成排序,退出循环。def bubble_sort(a):n=len(a)flag=Falsefor i in range( 1 ,n ):for j in range( 0,n-i ):if a[j]>a[j+1]:temp=a[j]a[j]=a[j+1]a[j+1]=tempflag=Trueif not flag:breakreturn a练一练有如下python程序段:a=[2,1,9,8,6,3]cnt=0for i in range(len(a)-1,0,-1):flag=Falsefor j in range(i):if a[j]>a[j+1]:a[j],a[j+1]=a[j+1],a[j]flag=Truecnt+=1if not flag:break则程序运行结束后,变量cnt的值为( )A.3 B.4 C.5 D.6B思考冒泡排序不足?数据交换发生的太频繁,影响计算机处理速度五个数据8,7,3,5,4,如何用尽可能少的交换次数,完成升序排序?8735483745887选择排序算法思想程序实现02选择排序Xuanze paixu概念:选择排序Xuanze paixu算法思想在排序数组的所有元素中找出最小(或最大)数据的元素,使它与第一个元素中的数据相互交换位置。然后在余下的元素中,找出最小(或最大)数据的元素与第二个元素中的数据相互交换位置。以此类推,直至排序完成。核心要 素趟数:n个数最多排 趟就完全有序找最值(最大或最小)和谁交换(第一个位置或最后一个位置)n-1选择排序Xuanze paixu43 56 23 15 50 78原始数据1515 56 23 43 50 782315 23 56 43 50 784315 23 43 56 50 785015 23 43 50 56 7856第1轮第2轮第3轮第4轮15 23 43 50 56 78第5轮问题1:6个数据共需处理_____轮?n个数据共需处理______轮?5n-1问题2:n个数据排序,最多交换次数为______次?n-1算法演算问题3:6个数一共比较了 次如果有n个数据进行选择排序,共需要比较____________次?n(n-1)/215选择排序Xuanze paixu43 56 23 15 50 78如何在数组中找到最小的数据?43231515最小的数据是15算法演算选择排序Xuanze paixu找到了最小数组元素后,如何交换?如何确定最小元素在数组中的位置?d[0] d[1] d[2] d[3] d[4] d[5]43 56 23 15 50 78确定元素的位置记录数组元素的下标K=0K=2K=3K=3K=3最小的数据在d[k]即d[3]如何把最小的元素和第1个数组元素进行交换?d[0],d[k]=d[k],d[0]算法演算选择排序Xuanze paixu算法演算思考:如何在6个数据中找出最小的数据并与第1个数据进行交换?(代码如何编写)①先假设最小数组元素的下标为1②利用循环语句逐个比较数组元素,并记录较小数据的数组下标③将最小的数据与第1个数据进行交换选择排序Xuanze paixu算法实现k=0for j in range( ):If_____________ :_______t=d[0]d[0]=d[k]d[k]=tIf_____________ :1,6d[k]>d[j]k=jk!=0第1轮选择排序Xuanze paixu算法实现推广到n个数据k=0for j in range( ):If_____________ :_______t=d[0]d[0]=d[k]d[k]=tIf_____________ :1,6d[k]>d[j]k=jk!=0for i in range( ):0,n-1ii+1,n+1it=d[i]d[i]=d[k]d[k]=t选择排序Xuanze paixu算法实现for i in range(0,n-2):k=ifor j in range(i+1,n):if a[k]>a[j]:k=jif k!=i:a[i],a[k]=a[k],a[i]①n个数据共需处理n-1轮②利用k来记录最小元素的下标③将余下的元素与最小元素进行比较,如果更小,则利用k记录该元素的数组下标④每一轮比较结束判断最小元素的下标k是否发生改变,如果发生改变,则说明存在更小的元素,需进行数据交换;否则的话,说明最小元素就是假设的该轮最前方元素练一练有如下一段代码a=[6,2,8,4,3,7]n=len(a)for i in range(0,n-2):k=ifor j in range(i+1,n):if a[k]>a[j]:k=jif k!=i:a[i],a[k]=a[k],a[i]print(a)Q1:这段代码实现的是 (选填:冒泡排序或选择排序)算法,根据代码可知第一趟排序选取的是 (选填:最大值或最小值)放在 (选填:第一个或最后一个)位置。Q2:代码运行结果为 。其中第二趟排序结果为 。选择排序最小值[2,3,4,6,7,8][2,3,8,4,6,7]第一个 展开更多...... 收起↑ 资源预览