资源简介 (共30张PPT)冒泡排序专题复习冒泡排序的思想从最下面一个元素起,依次比较相邻的两个元素中的数据,将较小的数据调换到上面,小元素像气泡一样上浮。如何实现将较小数逐次从下向上推移呢?冒泡排序的过程1 2 3 4 5设置数组变量:a(i)为牌的值(i=1、2、3、4、5)第一轮冒泡1 2 3 4 5a(5)>a(4),不交换a(4)交换a(3)a(2)第二轮冒泡1 2 3 4 5a(5)>a(4),不交换a(4)>a(3),不交换a(3)第三轮冒泡1 2 3 4 5a(5)>a(4),交换a(4)不换第四轮冒泡1 2 3 4 5a(5)交换分析与总结如果要对有5个元素的数组进行排序,那么1、要进行______轮冒泡2、第一轮冒泡,比较的范围从 到 ;第二轮冒泡,比较的范围从 到 ;第三轮冒泡,比较的范围从 到 ;第四轮冒泡,比较的范围从 到 。3、总比较次数 次,数据最多交换 次。4a(5)与a(4)a(2)与a(1)a(5)与a(4)a(5)与a(4)a(5)与a(4)a(3)与a(2)a(4)与a(3)a(5)与a(4)1010提高如果要对有n个元素的数组进行排序,那么1、要进行______轮冒泡2、第一轮冒泡,比较的范围从 到 ;第二轮冒泡,比较的范围从 到 ;第三轮冒泡,比较的范围从 到 ;……第n-1轮冒泡,比较的范围从 到 。3、总比较次数 次,数据最多交换 次。a(2)与a(1)a(3)与a(2)n-1a(n)与a(n-1)a(n)与a(n-1)a(n)与a(n-1)a(n)与a(n-1)a(n)与a(n-1)a(4)与a(3)n(n-1)/2n(n-1)/2冒泡排序程序实现For i= 1 to n-1For j= n to i+1 step -1If a(j)t=a(j):a(j)=a(j-1):a(j-1)=tEnd ifNext jNext i’外层循环控制冒泡轮数’注意j的初值和终值’满足条件,两数交换1.用冒泡排序算法对一组学生的身高数据进行升序排序,已知第一遍排序结束后的数据序列为165,168,178,175,171,则下列选项中不可能是原始数据序列的是A.165,178,175,168,171B.178,165,168,171,175C.168,178,175,165,171D.168,178,175,171,165B思考:若要把数列排成降序数列,程序如何修改?For i = 1 To n - 1For j = n To i + 1 Step -1If Thent = a(j): a(j) = a(j - 1): a(j - 1) = tEnd IfNext jNext ia(j)>a(j-1)思考:若从前往后实现大值“下沉”,程序如何修改?For i = 1 To n - 1For j =If a(j) < a(j - 1) Thent = a(j): a(j) = a(j - 1): a(j - 1) = tEnd IfNext jNext i2 to n-i+1思考:若从前往后实现大值“下沉”,程序如何修改?For i = n To 2 step -1For j =If a(j) < a(j - 1) Thent = a(j): a(j) = a(j - 1): a(j - 1) = tEnd IfNext jNext i2 to i思考:若把每一遍加工时数据比较位置改为j和j+1,程序如何修改?For i = 1 To n - 1For j =If a(j) > a(j + 1) Thent = a(j): a(j) = a(j + 1): a(j + 1) = tEnd IfNext jNext in-1 To i Step -1思考:若只需要寻找数组中最大的三个数,程序如何修改?For i =For j = n To i + 1 Step -1If Thent = a(j): a(j) = a(j - 1): a(j - 1) = tEnd IfNext jList1.AddItem Str(a(i))Next ia(j)>a(j-1)1 to 3a(j-1)思考:若只需要将数组x到y位置的元素进行排序(1<=x<=y<=n),程序如何修改?(考虑排序不同方向)For i = 1 to y-xFor j = x+1 to y-i+1If a(j) < a(j - 1) Thent = a(j): a(j) = a(j - 1): a(j - 1) = tEnd IfNext jNext iy to x+i step -12.有如下VB程序段:For i = 1 To 2For j = 5 To i + 1 Step -1If a(j) < a(j-1) Thent = a(j): a(j) = a(j-1): a(j-1) = tEnd IfNext jNext i数组元素a(1)到a(5)的值依次为“33,24,45,16,77”,经过该程序段“加工”后,数组元素a(1)到a(5)的值依次为A.16,24,33,45,77B.16,24,45,33,77 C.77,24,45,16,33D.77,45,33,24,16A3.有如下VB程序段:Dim a(1 To 6) As IntegerFor i = 1 To 6a(i) = Int(Rnd * 45) * 2 + 10Next iFor i = 1 To 2For j = 2 To 6 - iIf a(j) \ 10 > a(j - 1) \ 10 Thent = a(j): a(j) = a(j - 1): a(j - 1) = tEnd IfNext jNext i执行完该程序段后,下列选项中,a(1)到a(6)各元素的值可能是A.84,98,93,84,62,30B.70,60,10,28,18,14 C.34,44,36,14,16,94D.77,42,34,16,24,82C总结IF语句条件表达式即为排序的条件,按照什么内容(关键字)排序,排成什么状态(升序或者降序)。内层循环:循环变量范围控制参与排序元素的范围,全部参与还是部分参与,步长控制数据比较的方向,前面先有序还是后面先有序。外层循环:循环变量范围控制冒泡的个数,完全冒泡还是部分冒泡。程序优化:n个数不一定需要冒n-1个泡才完全有序,比如数组“3,5,7,9,11,2”冒一个泡后就实现了完全有序。如何实现一旦发现数组数据已经有序程序就不再进行排序,从而提高程序效率?思考:如何判断一个数组数据已经有序了?flag = False: i = 1Do While iflag = TrueFor j = n To i + 1 Step -1If a(j) < a(j - 1) Thent = a(j)a(j) = a(j - 1)a(j - 1) = tflag = FalseEnd IfNext ji = i + 1Loop某一轮冒泡过程没有发生数据交换,则说明数组有序4.有以下VB程序:flag = True : i = 1: n = 6Do While i<= n - 1 and flag = Trueflag = FalseFor j = n To i + 1 Step -1If a(j) < a(j - 1) Thent = a(j)a(j) = a(j - 1)a(j - 1) = tflag = TrueEnd IfNext ji = i + 1Loop有一数组a(1 to 6),其数值分别为“45,39,78,37,93,64”,想要按照从小到大排序,执行完该程序段后,数据总比较次数和总交换次数分别是A.9次和4次B.9次和6次C.12次和6次D.15次和12次C程序变式一:数组a(1 to 8) 10 5 8 6 9 4 15 9原序列:数组a(1 to 8) 4 5 6 8 9 9 10 15排序后:For i = 1 To n \ 2For j = n - i + 1 To i + 1 Step -1If a(j) < a(j - 1) Then t = a(j): a(j) = a(j - 1): a(j - 1) = tNext jFor j = i + 2 To n - i + 1 Step 1If a(j) < a(j - 1) Then t = a(j): a(j) = a(j - 1): a(j - 1) = tNext jNext i变式扩展:数组a(1 to 8) 10 5 8 6 9 4 15 9原序列:数组a(1 to 8) 4 5 6 8 9 9 10 15排序后:For i = 1 To n \ 2For j = i + 1 To n – i + 1 Step 1If a(j) < a(j - 1) Then t = a(j): a(j) = a(j - 1): a(j - 1) = tNext jFor j = n - i To i + 1 Step -1If a(j) < a(j - 1) Then t = a(j): a(j) = a(j - 1): a(j - 1) = tNext jNext i变式扩展:数组a(1 to 8) 10 5 8 6 9 4 15 9原序列:数组a(1 to 8) 4 6 9 10 15 9 8 5排序后:For i = 1 To n \ 2For j = n - i + 1 To i + 1 Step -1If a(j) < a(j - 1) Then t = a(j): a(j) = a(j - 1): a(j - 1) = tNext jFor j = i + 1 To n - iIf a(j+1) >a(j) Then t = a(j): a(j) = a(j + 1): a(j + 1) = tNext jNext i程序变式二:数组a(1 to 8) 10 5 8 6 9 4 15 9原序列:数组a(1 to 8) 4 15 5 10 6 9 8 9排序后:k = 1For i = 1 To n - 1For j = n To i + 1 Step -1If a(j)*k < a(j - 1)*k Thent = a(j): a(j) = a(j - 1): a(j - 1) = tEnd IfNext jk = - kNext i变式扩展:数组a(1 to 8) 10 5 8 6 9 4 15 9原序列:数组a(1 to 8) 15 4 10 5 9 6 9 8排序后:k = 1For i = 1 To n - 1For j = n To i + 1 Step -1If a(j)*k > a(j - 1)*k Thent = a(j): a(j) = a(j - 1): a(j - 1) = tEnd IfNext jk = - kNext i程序变式三:数组a(1 to 8) 10 5 8 6 9 4 15 9原序列:数组a(1 to 8) 8 4 9 5 10 6 15 9排序后:For i = 1 To (n – 1)\2For j = 1 To n - 2 * iIf a(j) > a(j + 2) Thent = a(j): a(j) = a(j + 2): a(j + 2) = tEnd IfNext jNext i变式扩展:数组a(1 to 8) 10 5 8 6 9 4 15 9原序列:数组a(1 to 8) 15 4 10 5 9 6 8 9排序后:k = 1For i = 1 To (n -1)\2For j = 1 To n - 2 * iIf a(j) * k < a(j + 2) * k Thent = a(j): a(j) = a(j + 2): a(j + 2) = tEnd Ifk = - kNext jNext i5.有如下VB程序段:k = 1For i = 1 To 2For j = 1 To 6 - 2 * iIf k * a(j) < k * a(j + 2) Thent = a(j): a(j) = a(j + 2): a(j) = tEnd Ifk = -kNext jNext i数组元素a(1 to 6)的初始 数值分别为“15,11,58,38,26,9”,执行完该程序段后,数据a元素的值分别是A.58,9,26,11,15,38B.58,38,26,11,15,9C.15,38,26,11,58,9D.58,38,26,15,11,9A 展开更多...... 收起↑ 资源预览