冒泡排序情景:1.观察水中的气泡往上冒的情景,气泡往上冒的时候有什么特点呢?2.第一次上体育课集队的时候体育老师是怎么样帮我们按身材的高低顺序进行排队的?冒泡原理冒泡排序和气泡在水中不断往上冒的情况有些类似。气泡大的(大的数据)在下面,气泡小的(小的数据)在上面。冒泡排序的基本原理是对存放原始数据的数组,按从前往后的方向进行多次扫描,每次扫描称为一趟。当发现相邻两个数据的次序与排序要求的大小次序不符合时,即将这两个数据进行互换。这样,较小的数据就会逐个向前移动,好象气泡向上浮起一样。做一做:下面我们请几位同学上来讲台为我们演示一下这种排序的过程,首先按照被叫到的顺序排列,再用这种方法由低到高进行排序。例:用冒泡排序的方法将下面一组无序数组排成从小到大{49,38,65,97,76,13,27,49}分析:首先为了方便分析,我们把所给的数据先用一个表格列出来,如下:对比原数据经过第一趟排序,实现了什么目的?第一趟排序,一共进行了多少次比较?4927137697653849数据87654321序号4938,交换位置原数据和序号序号12345678数据4938659776132749第一趟排序的步骤:序号12345678数据3849659776132749序号12345678数据3849659776132749序号12345678数据3849659776132749序号12345678数据3849657697132749序号12345678数据3849657613972749序号12345678数据3849657613279749序号12345678数据3849657613274997经过第一趟排序,把最大的数沉到最底了!4965,保持不变6597,保持不变9776,交换位置9713,交换位置9727,交换位置9749,交换位置经过第二趟排序,实现了什么目的?经过第二趟排序,把第二大的数沉到倒数第二个位置了!9749271376654938数据87654321序号3849,保持不变第一趟排序后的数据和序号第二趟排序的步骤:序号12345678数据38496576132749974965,保持不变6576,保持不变7613,交换位置7627,交换位置7649,交换位置序号12345678数据3849657613274997序号12345678数据3849657613274997序号12345678数据3849657613274997序号12345678数据3849651376274997序号12345678数据3849651327764997序号12345678数据38496513274976977697,保持不变序号12345678数据3849651327497697观察原数据与第一、二趟排序后的数据序号12345678数据3849657613274997序号12345678数据3849651327497697序号12345678数据4938659776132749问:为了使这一组无序数组完全按照要求排成从小到大我们还需不需要再继续排序呢?问:那么我们预计最多一共要经过多少次排序呢?例题:下面我们继续考虑,将我们刚才排序的全过程用算法流程图表示出来。我们把它分成几步来做,第一步,先把第一趟的排序用流程图描述出来。R[1]:=R[2]t:=R[1]R[1]:=R[2]R[2]:=t开始1.画出第一趟排序的算法流程图:假设该数据列为R[1],R[2],R[3],R[4],R[5],R[6],R[7],R[8]第一步做什么?R[1]R[2]是否如何交换数据,这样行吗?R[2]R[3]是否t:=R[2]R[2]:=R[3]R[3]:=t…不断的这样画下去要画多少个类似的选择结构?有没有办法让流程图更加简洁呢?这样交换数据,会有什么问题?分析:R[1]R[2]R[1]=R[2]是否t=R[1]R[1]=R[2]R[2]=t否是i:=i+1结束开始R[1]R[2]R[1]=R[2]是否t=R[1]R[1]=R[2]R[2]=ti:=1R[i]R[i+1]i7t:=R[i]R[i]:=R[i+1]R[i+1]:=t分析:1.画出第一趟排序的算法流程图:用简洁的循环结构进行表示否是i:=i+1结束开始R[1]R[2]R[1]=R[2]是否t=R[2]R[1]=R[2]R[2]=ti:=1R[i]R[i+1]t:=R[i]R[i]:=R[i+1]R[i+1]:=ti7分析:后面的排序只要按照这种方法不断进行就行了。2、按照这种画法第二趟、第三趟、第四趟排序的流程图怎样画?怎样把整个冒泡排序的流程图画出来?那么同样的结构要进行多少次呢?有没有办法让流程图更加简洁呢?是3、怎样把整个冒泡排序的流程图画出来?开始结束j7j:=1否j:=j+1是i7否i:=1i:=i+1是否R[i]R[i+1]t:=R[i]R[i]:=R[i+1]R[i+1]:=t分析:这是一个两重循环结构思考交流:在我们刚才的算法流程图中,每一趟的排序我们都进行了7次,是否每一趟的排序都需要进行7次比较呢?那么现在请你对我们刚才画出的算法流程图进行优化,设计出更好的流程图避免不必要的工作。观察原数据与第一、二趟排序后的数据序号12345678数据3849657613274997序号12345678数据3849651327497697序号12345678数据4938659776132749我们知道经过第一趟的排序之后,最大的一个数已经排到最后了这样在进行第二趟排序时有没有必要再对第7、8个数据再进行排序呢?参照我们第一趟排序的画法、第二趟排序的流程图此时只需进行6次。否是i:=i+1结束开始R[1]R[2]R[1]=R[2]是否t=R[2]R[1]=R[2]R[2]=ti:=1R[i]R[i+1]t:=R[i]R[i]:=R[i+1]R[i+1]:=ti7否是i:=i+1结束开始R[1]R[2]R[1]=R[2]是否t=R[2]R[1]=R[2]R[2]=ti:=1R[i]R[i+1]t:=R[i]R[i]:=R[i+1]R[i+1]:=ti6分析:否是ij那么我们可以把整个冒泡排序的流程图优化成如图所示:开始结束否j0j:=7是j:=j-1i:=1i:=i+1是否R[i]R[i+1]t:=R[i]R[i]:=R[i+1]R[i+1]:=t分析:小结:本节课主要学习了冒泡排序的基本原理及其算法流程图,冒泡排序是最常用也是最基本的排序方法,很多其他的排序方法都可以由它改进而来,比如现在常用的快速排序法等。双循环是我们本节课刚接触的一种复杂结构,应用到本节知识的实例很多,比如:打印九九乘法口诀表、彩票数字选择器,工作表安排等等。作业:P128A3课后思考交流:在刚才的冒泡排序中是否一定要进行7趟?针对这个问题你有什么好的方法对我们的算法再进行优化?选做题:设计一个算法流程图,让计算机输出九九乘法表。