冒泡排序算法实现.docx

上传人:b****8 文档编号:28019236 上传时间:2023-07-07 格式:DOCX 页数:17 大小:430.16KB
下载 相关 举报
冒泡排序算法实现.docx_第1页
第1页 / 共17页
冒泡排序算法实现.docx_第2页
第2页 / 共17页
冒泡排序算法实现.docx_第3页
第3页 / 共17页
冒泡排序算法实现.docx_第4页
第4页 / 共17页
冒泡排序算法实现.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

冒泡排序算法实现.docx

《冒泡排序算法实现.docx》由会员分享,可在线阅读,更多相关《冒泡排序算法实现.docx(17页珍藏版)》请在冰豆网上搜索。

冒泡排序算法实现.docx

冒泡排序算法实现

冒泡排序的算法及其程序实现

浙江省慈溪中学施迪央

教学分析:

本节课是浙江教育出版社出版的普通高中课程标准实验教科书《算法与程序设计》第二第3节以及第五章第3节的部分教学内容。

一组不长的数据(如5个),从小到大排序,对学生来说是一件容易的事情,但他们并不知道计算机是怎么实现排序的,同时他们也没见识过计算机对大量数据(如1000个)的排序。

学习排序有助于学生对计算机工作原理的认识。

冒泡排序对学生来说初次接触,但前面的枚举算法和解析算法的部分内容对学习排序有一定的帮助,如数组变量的定义及使用方法、双重循环的使用方法及特点以及如何通过键盘输入一批数据(即text1_keypress()事件)在前面都已涉及,冒泡排序的学习又可以巩固前面的知识。

关于冒泡排序的算法及程序实现我安排了3个课时,本案例是在教室内完成的2节随堂课,第3课时安排学生上机实践:

对键盘输入的一批数据进行冒泡排序。

教学目标:

1、知识与技能:

了解排序及冒泡排序的概念及特点

掌握冒泡排序算法的原理

初步掌握冒泡排序的程序实现

2、过程与方法:

理解冒泡排序的分析过程,并初步掌握用冒泡排序算法来设计解决简单的排序问题

3、情感态度与价值观:

通过冒泡排序算法的分析过程,培养学生思维的严谨性以及用科学方法解决问题的能力

使学生深入理解计算机的工作原理,激发了学生学习程序兴趣。

教学重点:

冒泡排序算法的原理

教学难点:

分析冒泡排序的实现过程

教学策略:

讲授法与探究法。

教师讲授、学生听讲,教师提问、学生动脑,层层深入,步步为营,一切水到渠成。

教学准备:

编写好手动输入一批的数据的冒泡排序的程序

编写好计算机自动生成数据的冒泡排序的程序

课堂中使用的教学课件

教学过程:

一、问题引入

问题一:

什么是排序?

所谓排序,把杂乱无章的一列数据变为有序的数据,比如7,3,4,8,1这五个数据从小到大排序,结果是1,3,4,7,8,我们很容易排出来。

那么电脑是怎么进行排序的呢?

问题二:

一批数据在VB中如何存储的?

比如如何存储六位裁判为一位运动员评出的分数?

用数组变量来存储一批类型、作用相同的数据,如分别用d

(1),d

(2),d(3),d(4),d(5),d(6)来存储六位裁判给出的分数。

问题三:

如果运动员的最后得分是从这6个分数中去掉最高分与最低分后的平均分,你认为怎么得到?

调整数组d中所有数据的存储位置,使最小的数据存储在d

(1)中,最大的数据存储在d(6)中,使所有数据满足:

d

(1)≤d

(2)≤d(3)≤d(4)≤d(5)≤d(6)

二、冒泡排序的算法及程序实现

1、冒泡排序(bubblesort)的思想

在一列数据中把较小的数据逐次向上推移的一种技术。

冒泡排序把待排序的n个元素的数组看成是垂直堆放的一列数据,从最下面的一个元素起,自下而上地比较相邻的两个元素中的数据,将较小的数据换到上面的一个元素中。

重复这一过程,直到处理完最后两个元素中的数据,称为一遍加工。

当第一遍加工完成时,最小数据已经上升到第一个元素位置。

然后对余下的n-1个元素重复上述处理过程,直至最后进行余下两个数据的比较和交换。

2、提出待排序的任务

有下面一组数据,7、3、4、8、1,用冒泡法(逐次向上推移)实现从小到大的排序,假如这5个数据分别用数组变量a的5个数组元素a

(1)、a

(2)、a(3)、a(4)、a(5)来存储

3、冒泡排序的算法及程序初步实现

(1)第一遍加工:

演示:

打开冒泡.swf,演示如下图1

图1

问题一:

最小数据1是如何进行逐次向上推移到达第一个数据位置的,即a

(1)=1?

演示如下图2:

第五位置(即a(5))的1与第四位置(即a(4))的8比较,交换;

第四位置(即a(4))的1与第三位置(即a(3))的4比较,交换;

前三位置(即a(3))的1与第二位置(即a

(2))的3比较,交换;

第二位置(即a

(2))的1与第一位置(即a

(1))的7比较,交换;

图2

说明:

当第五个位置的数据1从上升到第一个位置,称为第一遍加工

问题二:

第一遍加工的结果?

a

(1)=1,a

(2)~a(5)为无序区域。

问题三:

比较了几次?

交换了几次?

比较交换的条件是什么?

比较4次,交换4次,即相邻位置的两个数据比较,如果a(j)

问题五:

4次比较与交换,可以用VB的哪个算法模式来实现?

如何描述

For循环+If选择

fori=5to2step-1

ifa(i)

nexti

根据代码解释:

最末位置的数据与前面相邻位置的数据发生比较,如果小于前面位置的数据,则交换;重复这一过程,直到处理完第二个位置的数据与第一个位置的数据为止,完成第一遍加工

问题六:

比较下面两组代码,你认为哪组好?

为什么?

fori=4to1step-1

ifa(i+1)

nexti

fori=5to2step-1

ifa(i)

nexti

第一组好,因为第一组更清楚表达第一遍的加工过程,也更易理解。

(2)第二遍加工(边提问边回答,边演示,如图3)

图3

问题一:

第二遍加工的数据区域为哪些?

过程是怎样的?

数据区域为a

(2)~a(5)的无序的区域

第五个位置的8与第四位置的4发生比较,不交换;第四个位置的4与第三个位置的3比较,不交换;第三个位置的3与第二个位置的7比较,交换;完成第二遍加工(见图3)

问题二:

第二遍加工的结果怎样?

实现的代码如何?

结果a

(2)=3,a(3)~a(5)是无序区域

代码如下:

fori=5to3step-1

ifa(i)

nexti

问题三:

第二遍加工,比较了几次,交换了几次?

比较了3次,交换了1次

(3)第三遍加工(边提问边回答,边演示,如图4)

问题一:

第三遍加工的结果、过程又如何?

语句呢?

第三遍加工的结果:

a(3)=4,a(4)~a(5)为无序区域

第五个位置的8与第四个位置4的比较,不交换;第四个位置的4与第三个位置的7比较,交换;完成第三遍加工

实现的语句:

fori=5to4step-1

ifa(i)

nexti

问题二:

比较和交换的次数各是多少?

比较了2次,交换了1次

图4

(4)第四遍加工

问题一:

第四遍加工的结果?

实现的代码?

第四遍加工的结果:

a(4)=7,a(5)=8

实现的语句:

fori=5to5step-1

ifa(i)

nexti

 

问题二:

第四遍加工比较、交换的次数各多少?

比较了1次,交换了0次

4、5个数据冒泡排序的程序实现

问题一:

五个数据通过冒泡排序,完成从小到大的顺序,需要加工几遍?

如果是n个数据呢?

4遍,n-1遍

问题二:

4遍加工的共同点是什么?

不同点又是什么?

相同点:

都是重复比较(循环结构),相同的比较方法和相同的交换条件

不同点:

比较与交换的次数不一样

问题三:

4遍加工是否可以用双重循环来实现?

可以,代码如下:

forj=1to4

fori=5toj+1step-1

ifa(i)

nexti

nextj

说明:

对于循环次数确定的循环,比如循环4次,使用For循环,循环变量的变化方式有多种表达,如Forj=2to5或者forj=4to7等,但我们选择forj=1to4,因为它是最易理解的一种表达

问题四:

4遍加工一共比较了几次?

交换了几次?

比较的次数为:

4+3+2+1=10;交换的次数为:

4+1+1=6

5、n个数据冒泡排序的通用代码

Fori=1ton-1

forj=ntoi+1step-1

ifa(j)

 nextj

Nexti

问题一:

在通用代码中,外、内循环的条件各是什么?

外循环的循环条件为:

i<=n-1;内循环的循环条件为:

j>=i+1(j>i)

问题二:

在通用代码中,外、内循环的意义是什么?

外循环是加工的遍数,n个数据需要加工n-1遍

内循环是每一遍的具体加工过程

问题三:

如何实现a(j)与a(j-1)的交换?

使用什么语句

学生回答:

通过第三个变量temp

Temp=A(j)

A(j)=A(j-1)

A(j-1)=Temp

6、演示冒泡排序算法.swf,观察流程图,体验流程的执行过程,并请学生用语言表达程序运行过程

 

三、对键盘输入的一批数据进行冒泡排序

1、关于程序的界面

问题一:

你能想象出程序的界面吗?

学生思考后并给展示如下的建议界面:

问题二:

根据此界面,你能大致描述一下程序的运行过程吗?

在黄色文本框内输入数据后,按回车键,在左边列表框list1内显示输入的数据,依次输入一批数据,然后单击“冒泡排序”按钮,在列表框list2中显示已排完序的一列数据

问题三:

界面上有几个对象?

一个窗体(form1)、二个列表框(list1、list2)、一个文本框(text1)、一个命令按钮(command1)和三个标签(label1、label2、label3)

问题四:

在哪些对象上发生哪些事件?

在text1的keypress事件和command1的click事件

2、编写事件的代码

问题一:

请尝试编写text1_keypress()事件的代码

SubText1_KeyPress(KeyAsciiAsInteger)

IfKeyAscii=13Then

c=c+1

a(c)=Val(Text1.Text)

List1.AddItema(c)

Text1.Text="":

Text1.SetFocus

EndIf

EndSub

说明:

text1_keyPress()事件,在计算并联电阻的总电阻值时已使用过,所不同的是增加了计数功能。

问题二:

当在text1中用键盘输入回车键后,做些什么内容?

1计数(c=c+1)

2给数组变量a赋值

3数组变量 的值在list1中显示

4text1清空,并把光标聚焦在text1中

问题三:

为什么要计数?

(c=c+1)

计数是为了统计待排序数据的个数

问题四:

数组变量a和变量c需要在text1_keypress()事件中定义吗?

不用,作全局性变量处理,在两个模块外添加如下两行:

Dima(1to128)asinteger

DimcAsInteger

说明:

全局性变量的处理在计算并联电路的总电阻中已学习过。

问题五:

如果要手动输入50个待排序的数据,需要执行text1_keypress()事件几遍?

50遍

问题六:

请尝试编写command1_click()事件

SubCommand1_Click()

ForI=1Toc-1

ForJ=cToI+1Step-1

Ifa(J)

TEMP=a(J):

a(J)=a(J-1):

a(J-1)=TEMP

EndIf

NextJ

NextI

ForI=1Toc

List2.AddItema(I)

NextI

EndSub

问题七:

command1_click()事件实现哪几项功能?

两项功能:

一项是冒泡排序,一项是把已排好序的数组a输出(用for循环实现)

教师演示事先编好的程序,让学生观察并体验程序的执行过程

3、关于程序的升降序功能

问题一:

如果要实现升降序的功能,界面与代码如何修改?

①界面修改:

添加一控件combobox,生成combo1对象

②Command1_click()代码修改如下:

说明:

else后面即为降序排序,比较的条件由原来a(J)a(J-1)即可。

③添加一窗体加载模块

对三个语句稍作解释:

按下程序运行按钮,执行Form_load事件,在combo1中添加两项“升序”、“降序”,界面上显示的是升序,因为combo1.ListIndex=0

教师演示事先编好的具有升降功能的程序,让学生观察并体验程序的执行过程

四、关于冒泡排序的小结

1、排序及冒泡排序的概念

2、冒泡排序的算法思想

3、n个数据冒泡排序的通用程序代码

4、用冒泡排序法对键盘输入的一批数据从小到大排序的程序实现

变量 a

(1)a

(2)a(3)a(4)a(5)

初始 73481

结果13478

五、教学后记:

排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。

通过排序算法的学习,使学生了解计算机的排序原理。

冒泡排序算法对学生来说是相对较难的一种算法。

从冒泡排序的概念出发,结合实例,用设问的方法一步步地引导学生认识冒泡排序的算法思想,分析冒泡排序的过程,总结出冒泡排序的代码,一切自然而然,水到渠成。

曾有一个在学习算法时说了这样一句话:

学习编程,使简单的问题复杂化,使复杂的问题简单化。

这句话在排序算法中得到很好地体现。

//经典冒泡排序

voidBubbleSort(intarr[],intn)

{

    inti=0,j=0;    

    for(i=0;i

      for(j=0;j

      {

            if(arr[j]>arr[j+1])

            {

                      temp=arr[j];

                      arr[j]=arr[j+1];

                      arr[j+1]=temp;

            }            

      }    

}

#include

  voidshow(int*p)

  {

  inti=0;

  for(i=0;i<8;i++)

  {

  printf("%3d",p[i]);

  }

  printf("\n");

  }

  intmain(intargc,char*argv[])

  {

  intp[]={8,9,4,5,1,7,6,0};

  inti=0;

  intj=0;

  inttmp=0;

  for(i=0;i<8;i++)

  {

  for(j=0;j<7-i;j++)

  {

  if(p[j]>p[j+1])

  {

  tmp=p[j];

  p[j]=p[j+1];

  p[j+1]=tmp;

  }

  }

  printf("第%2d轮排序结束:

",i+1);

  show(p);

  }

  return0;

  }来源:

考试大

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1