張文慧
摘要:本文主要探討了以冒泡排序為例的教學設計,著重分析了冒泡排序的特點,并以問題引領,引導學生學會主動思考問題,并學會對問題進行總結歸納,同時強調(diào)了教學設計的重要性。
關鍵詞:冒泡排序;教學設計;C語言;教學設計
中圖分類號:G642? ? ? ? 文獻標識碼:A
文章編號:1009-3044(2020)32-0183-02
1引言
《C語言程序設計》 前幾章主要學習程序的結構和離散數(shù)據(jù)的處理,由離散數(shù)據(jù)的處理,逐漸過渡到通過數(shù)組對批量數(shù)據(jù)進行處理,而冒泡排序是數(shù)組應用的重點難點。好的教學設計,對于老師清晰講述冒泡排序的原理,非常關鍵。
2 教學過程設計
2.1問題情境設計
首先提出問題:a、b、c三個數(shù)按照升序排序,如何實現(xiàn)?解決問題:通過相鄰兩數(shù)的依次比較求出一個大數(shù)存入c,再比較a和b的大小關系,大數(shù)存入b,小數(shù)存入c,這時3個數(shù)就成為一個有序序列。然后將3個數(shù)中相鄰兩數(shù)依次比較的思路引入到10個數(shù)排序中,將學生的思維由3個變量的依次比較逐漸過渡到批量數(shù)據(jù)(數(shù)組)的處理,引出冒泡排序的思路。
2.2 冒泡排序思想
依次比較相鄰的兩個數(shù),若逆序,則交換,若是升序排序,則將較大數(shù)后移;若是降序排序,則將較小數(shù)后移。
對10個數(shù)進行升序排序,步驟如下:
(1)首先,從a[0]至a[9]依次掃描,比較a[j]和a[j+1]兩個數(shù)的大小關系,找出最大數(shù),置入a[9]中;
(2)再找出a[0]至a[8]中的最大數(shù),置入a[8]中;
(3)依此類推,最后找出a[0]和a[1]的最大數(shù),置入a[1]中,最小數(shù)置入a[0]中,至此,排序完成。
2.3實例展示
我們以下面的實例來分析冒泡排序,有10個數(shù),分別是:8,5,2,6,7,4,1,9,12,10
原始數(shù)據(jù)為:
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)次
授課過程中不斷提出問題啟發(fā)學生思考:
問題一:第一趟排序中有多少次比較?交換了多少次?學生回答:比較9次,交換7 次。
討論:完成兩個數(shù)比較交換的代碼是什么?
問題二:在第一趟排序中,j的值從多少變化到多少?
依次在第二趟至第九趟排序中提出上述問題,并引導學生進行歸納總結。
歸納上述問題:第一趟,比較9次,j的值從0變化到8
第二趟,比較8次,j的值從0變化到7
第三趟,比較7次,j的值從0變化到6
...........
第八趟,比較2次,j的值從0變化到1
第九趟,比較1次,j的值從0變化到0
然后寫出每趟排序的代碼:
通過學生對以上問題的回答,逐漸引導學生歸納總結得出9趟排序的代碼,可以用一個雙重for循環(huán)來實現(xiàn)。主要算法如下:
整個環(huán)節(jié)以老師設問,學生回答,課堂的主要角色以學生為主角,學生是課堂的主體,在老師的引領下,學生積極思考、討論,并踴躍發(fā)言,在思維的火花不斷地碰撞中,學生真正體會到了自己解決問題的快樂,成就感倍增。
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])? ?//相鄰的兩個數(shù)比較
{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 改進與拓展
大學中,一堂好課的教學設計關鍵在于啟發(fā)學生的深入思考,上述流程已經(jīng)引導學生寫出程序代碼,并演示運行。老師繼續(xù)提出問題,請學生思考:一個有序序列需要進行多少趟排序或者一個序列在最后一趟之前的幾趟就成為有序序列了,后面的排序還需要進行嗎?
根據(jù)學生的回答,逐步引導學生思考冒泡排序算法的優(yōu)化。
可以定義一個標記(flag),并給flag賦初值為1,如果某一趟排序沒有交換,就說明此時數(shù)組是有序序列,不需要再繼續(xù)進行比較,這樣可以節(jié)省時間。主要算法如下:
for(i=0;i<=8;i++)? ?//共9趟,每一趟將一個最大數(shù)沉到最底部
{int flag=1;
for(j=0;j<=8-i;j++)
if(a[j]>a[j+1])? ?//相鄰的兩個數(shù)比較
{t=a[j];? a[j]=a[j+1];? a[j+1]=t; flag=0;}
if(flag) break;}
老師繼續(xù)提出問題,引導學生思考:n個數(shù)呢,共需多少趟?每趟比較多少次?寫出如下n個數(shù)的排序源程序:
for(i=0;i<=n-2;i++)
{int flag=1;
for(j=0;j<=n-2-i;j++)
if(a[j]>a[j+1])? ?//相鄰的兩個數(shù)比較
{t=a[j];? a[j]=a[j+1];? a[j+1]=t; flag=0;}
if(flag) break;}
2.6 練習鞏固
老師給出練習題讓學生練習鞏固冒泡排序的思路和過程:對n個整數(shù)使用冒泡排序法從小到大排序,共進行n-1趟,要求輸出每一趟的排序情況。通過練習,根據(jù)學生練習的情況再次抓重點幫助學生處理程序調(diào)試過程中遇到的各種問題。
3小結
整個教學設計過程始終堅持以學生為主體,以問題為導向,問題的設計由淺入深,環(huán)環(huán)相扣,逐漸將學生的思維引向深入思考,然后通過思考后的歸納總結幫助學生很好地掌握了冒泡排序這一難點,極大地提高了學生的學習積極性。
參考文獻:
[1] 曹春梅,宋潔.冒泡排序及其改進算法的教學設計與實現(xiàn)[J].無線互聯(lián)科技,2019,16(04):155-157.
[2] 宋美英.基于C語言的冒泡排序算法探討[J].現(xiàn)代計算機(專業(yè)版),2011(29):48-49+55.
[3] 程妮.C語言中冒泡排序算法的教學設計與分析[J].現(xiàn)代計算機(專業(yè)版),2016(10):59-63.
[4] 張朝鑫,顏昌沁.C語言中的冒泡排序算法優(yōu)化[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語言實現(xiàn)及其效率分析[J].福建電腦,2013,29(11):55-56+94.
[8] 王洋.基于動態(tài)可視化分析的冒泡排序程序設計的探究式教學方法[J].教育教學論壇,2016(41):257-258.
【通聯(lián)編輯:王力】