C语言中冒泡排序的课堂教学设计
2020-12-29张文慧
张文慧
摘要:本文主要探讨了以冒泡排序为例的教学设计,着重分析了冒泡排序的特点,并以问题引领,引导学生学会主动思考问题,并学会对问题进行总结归纳,同时强调了教学设计的重要性。
关键词:冒泡排序;教学设计;C语言;教学设计
中图分类号:G642 文献标识码:A
文章编号:1009-3044(2020)32-0183-02
1引言
《C语言程序设计》 前几章主要学习程序的结构和离散数据的处理,由离散数据的处理,逐渐过渡到通过数组对批量数据进行处理,而冒泡排序是数组应用的重点难点。好的教学设计,对于老师清晰讲述冒泡排序的原理,非常关键。
2 教学过程设计
2.1问题情境设计
首先提出问题:a、b、c三个数按照升序排序,如何实现?解决问题:通过相邻两数的依次比较求出一个大数存入c,再比较a和b的大小关系,大数存入b,小数存入c,这时3个数就成为一个有序序列。然后将3个数中相邻两数依次比较的思路引入到10个数排序中,将学生的思维由3个变量的依次比较逐渐过渡到批量数据(数组)的处理,引出冒泡排序的思路。
2.2 冒泡排序思想
依次比較相邻的两个数,若逆序,则交换,若是升序排序,则将较大数后移;若是降序排序,则将较小数后移。
对10个数进行升序排序,步骤如下:
(1)首先,从a[0]至a[9]依次扫描,比较a[j]和a[j+1]两个数的大小关系,找出最大数,置入a[9]中;
(2)再找出a[0]至a[8]中的最大数,置入a[8]中;
(3)依此类推,最后找出a[0]和a[1]的最大数,置入a[1]中,最小数置入a[0]中,至此,排序完成。
2.3实例展示
我们以下面的实例来分析冒泡排序,有10个数,分别是:8,5,2,6,7,4,1,9,12,10
原始数据为:
8,5,2,6,7,4,1,9,12,10
第一趟结果如下:
5,2,6,7,4,1,8,9,10,12
总结:比较(9)次,交换(7)次
第二趟结果如下:
2,5,6,4,1,7,8,9,10,12
总结:比较(8)次,交换(3)次
第三趟结果如下:
2,5,4,1,6,7,8,9,10,12
总结:比较(7)次,交换(1)次
第四趟结果如下:
2,4,1,5,6,7,8,9,10,12
总结:比较(6)次,交换(1)次
第五趟结果如下:
2,1,4,5,6,7,8,9,10,12
总结:比较5次,交换(1)次
第六趟结果如下:
1,2,4,5,6,7,8,9,10,12
总结:比较(4)次,交换(1)次
第七趟结果如下:
1,2,4,5,6,7,8,9,10,12
总结:比较(3)次,交换(0)次
第八趟结果如下:
1,2,4,5,6,7,8,9,10,12
总结:比较(2)次,交换(0)次
第九趟结果如下:
1,2,4,5,6,7,8,9,10,12
总结:比较(1)次,交换(0)次
授课过程中不断提出问题启发学生思考:
问题一:第一趟排序中有多少次比较?交换了多少次?学生回答:比较9次,交换7 次。
讨论:完成两个数比较交换的代码是什么?
问题二:在第一趟排序中,j的值从多少变化到多少?
依次在第二趟至第九趟排序中提出上述问题,并引导学生进行归纳总结。
归纳上述问题:第一趟,比较9次,j的值从0变化到8
第二趟,比较8次,j的值从0变化到7
第三趟,比较7次,j的值从0变化到6
...........
第八趟,比较2次,j的值从0变化到1
第九趟,比较1次,j的值从0变化到0
然后写出每趟排序的代码:
通过学生对以上问题的回答,逐渐引导学生归纳总结得出9趟排序的代码,可以用一个双重for循环来实现。主要算法如下:
整个环节以老师设问,学生回答,课堂的主要角色以学生为主角,学生是课堂的主体,在老师的引领下,学生积极思考、讨论,并踊跃发言,在思维的火花不断地碰撞中,学生真正体会到了自己解决问题的快乐,成就感倍增。
2.4 完整源程序
#include
int main()
{int a[10],t,i,j,k;
for(i=0;i<=9;i++) scanf("%d",&a[i]);
for(i=0;i<=8;i++)
{for(j=0;j<=8-i;j++)
if(a[j]>a[j+1]) //相邻的两个数比较
{t=a[j]; a[j]=a[j+1]; a[j+1]=t; }
}
for(k=0;k<=9;k++)
printf("%5d",a[k]);
printf("\n");
return 0;}
2.5 改进与拓展
大学中,一堂好课的教学设计关键在于启发学生的深入思考,上述流程已经引导学生写出程序代码,并演示运行。老师继续提出问题,请学生思考:一个有序序列需要进行多少趟排序或者一个序列在最后一趟之前的几趟就成为有序序列了,后面的排序还需要进行吗?
根据学生的回答,逐步引导学生思考冒泡排序算法的优化。
可以定义一个标记(flag),并给flag赋初值为1,如果某一趟排序没有交换,就说明此时数组是有序序列,不需要再继续进行比较,这样可以节省时间。主要算法如下:
for(i=0;i<=8;i++) //共9趟,每一趟将一个最大数沉到最底部
{int flag=1;
for(j=0;j<=8-i;j++)
if(a[j]>a[j+1]) //相邻的两个数比较
{t=a[j]; a[j]=a[j+1]; a[j+1]=t; flag=0;}
if(flag) break;}
老师继续提出问题,引导学生思考:n个数呢,共需多少趟?每趟比较多少次?写出如下n个数的排序源程序:
for(i=0;i<=n-2;i++)
{int flag=1;
for(j=0;j<=n-2-i;j++)
if(a[j]>a[j+1]) //相邻的两个数比较
{t=a[j]; a[j]=a[j+1]; a[j+1]=t; flag=0;}
if(flag) break;}
2.6 练习巩固
老师给出练习题让学生练习巩固冒泡排序的思路和过程:对n个整数使用冒泡排序法从小到大排序,共进行n-1趟,要求输出每一趟的排序情况。通过练习,根据学生练习的情况再次抓重点帮助学生处理程序调试过程中遇到的各种问题。
3小结
整个教学设计过程始终坚持以学生为主体,以问题为导向,问题的设计由浅入深,环环相扣,逐渐将学生的思维引向深入思考,然后通过思考后的归纳总结帮助学生很好地掌握了冒泡排序这一难点,极大地提高了学生的学习积极性。
参考文献:
[1] 曹春梅,宋洁.冒泡排序及其改进算法的教学设计与实现[J].无线互联科技,2019,16(04):155-157.
[2] 宋美英.基于C语言的冒泡排序算法探讨[J].现代计算机(专业版),2011(29):48-49+55.
[3] 程妮.C语言中冒泡排序算法的教学设计与分析[J].现代计算机(专业版),2016(10):59-63.
[4] 张朝鑫,颜昌沁.C语言中的冒泡排序算法优化[J].硅谷,2013,6(19):166+157.
[5] 陈思敏.基于C语言的几种排序算法的分析[J].电子设计工程,2013,21(17):53-54+59.
[6] 劉培元.C语言中冒泡排序算法的分层次学习[J].电脑知识与技术,2013,9(35):7987-7989.
[7] 龚佳,刘远军.一种双向冒泡排序算法的C语言实现及其效率分析[J].福建电脑,2013,29(11):55-56+94.
[8] 王洋.基于动态可视化分析的冒泡排序程序设计的探究式教学方法[J].教育教学论坛,2016(41):257-258.
【通联编辑:王力】