程 妮
(運(yùn)城學(xué)院公共計(jì)算機(jī)教學(xué)部,運(yùn)城 044000)
?
C語言中冒泡排序算法的教學(xué)設(shè)計(jì)與分析
程妮
(運(yùn)城學(xué)院公共計(jì)算機(jī)教學(xué)部,運(yùn)城044000)
摘要:冒泡排序算法是高校C語言教學(xué)的重難點(diǎn),而傳統(tǒng)的教學(xué)方法效果并不理想。探討一個(gè)利用多媒體教學(xué)手段,結(jié)合問題引導(dǎo)教學(xué)法和口訣教學(xué)法的教學(xué)過程設(shè)計(jì),大大激發(fā)了學(xué)生學(xué)習(xí)的興趣,使學(xué)生更好地掌握冒泡排序算法的原理,培養(yǎng)學(xué)生的獨(dú)立思考能力和發(fā)散思維能力,取得良好的教學(xué)效果。
關(guān)鍵詞:算法;冒泡排序;問題引導(dǎo);口訣;發(fā)散思維
排序算法是程序設(shè)計(jì)語言中的一個(gè)很重要的內(nèi)容,其應(yīng)用范圍廣、使用頻率高,因此專家學(xué)者們研究了各種排序算法。在高校的《C語言程序設(shè)計(jì)》課程中,也將排序算法作為重難點(diǎn)進(jìn)行教學(xué),一般以冒泡排序?yàn)槔齺碇v解排序的原理。傳統(tǒng)教學(xué)中,教師先講解冒泡排序的思想,然后編寫程序代碼再執(zhí)行。這種方式比較枯燥,難以調(diào)動學(xué)生學(xué)習(xí)的積極性,學(xué)生理解和掌握冒泡排序也比較困難,從而達(dá)不到教學(xué)目標(biāo)。因此如何合理地設(shè)計(jì)教學(xué)過程,激發(fā)學(xué)生的學(xué)習(xí)興趣,讓學(xué)生掌握冒泡排序的思想和編程方法,提高學(xué)生發(fā)現(xiàn)問題、思考問題和解決問題的能力,培養(yǎng)學(xué)生的發(fā)散思維能力,是一個(gè)關(guān)鍵問題。
問題引導(dǎo)教學(xué)法是以問題為中心,以學(xué)生為主體的一種教學(xué)方法,倡導(dǎo)將教學(xué)目標(biāo)或內(nèi)容以問題的形式來呈現(xiàn),基本的教學(xué)理念可以概括為五個(gè)環(huán)節(jié),即提出問題、解決問題、概括歸納、拓展應(yīng)用、生成創(chuàng)新。冒泡排序法雖然原理簡單,但過程復(fù)雜,學(xué)生的學(xué)習(xí)積極性不高,不易于理解,而問題引導(dǎo)教學(xué)法的實(shí)施,使得學(xué)生在學(xué)習(xí)中思想活躍,發(fā)現(xiàn)問題、提出問題、解決問題的能力也增強(qiáng)了,同時(shí)也培養(yǎng)了學(xué)生的發(fā)散思維和合作精神。
口訣教學(xué)法是教師把所講授的知識或內(nèi)容編制成重點(diǎn)突出、形象生動的口訣,學(xué)生容易理解和接受。在教學(xué)過程中,實(shí)施口訣教學(xué)法能激發(fā)學(xué)生的學(xué)習(xí)興趣,使學(xué)生對冒泡排序的思想和過程有個(gè)整體、全面的認(rèn)識,并能從排序算法順利地過渡到代碼的編寫,使學(xué)生更好地掌握冒泡排序。
2.1算法的概念和特點(diǎn)
算法即解決問題的方法和步驟。正確的算法有以下幾個(gè)特征:(1)可行性,算法中每條語句必須是可以實(shí)現(xiàn)的。(2)有窮性,算法的執(zhí)行次數(shù)必須是有限的。(3)確定性,算法的中的每一步驟必須有確切的語義。(4)輸入,算法可以有0個(gè)或多個(gè)輸入。(5)輸出,算法應(yīng)該有1個(gè)或多個(gè)輸出[1]。
2.2冒泡排序算法概述
在程序設(shè)計(jì)語言中,排序算法主要有冒泡排序、快速排序、選擇排序以及計(jì)數(shù)排序等[2]。
冒泡排序(Bubble Sort)是最簡單和最通用的排序方法,其基本思想是:在待排序的一組數(shù)中,將相鄰的兩個(gè)數(shù)進(jìn)行比較,若前面的數(shù)比后面的數(shù)大就交換兩數(shù),否則不交換;如此下去,直至最終完成排序[3]。由此可得,在排序過程中,大的數(shù)據(jù)往下沉,小的數(shù)據(jù)往上浮,就像氣泡一樣,于是將這種排序算法形象地稱為冒泡排序。
3.1利用多媒體手段,創(chuàng)設(shè)情境引入新知
【提出問題】:如何利用C語言程序?qū)W(xué)生的課程成績進(jìn)行排序?
教師播放提前準(zhǔn)備好的冒泡排序動畫或視頻,該動畫生動有趣,直觀地演繹了數(shù)據(jù)序列的排序過程,該方式吸引了學(xué)生的眼球,提高了學(xué)生的學(xué)習(xí)興趣。動畫播放完成后,結(jié)合PPT課件,教師引導(dǎo)學(xué)生觀察、總結(jié)冒泡排序的基本原理:對數(shù)據(jù)序列的相鄰兩個(gè)數(shù)據(jù)進(jìn)行比較,如果前者比后者大,則交換兩數(shù)。
【提出問題】:在排序過程中,如何對數(shù)據(jù)進(jìn)行比較和交換呢?
下面通過PPT動畫逐步解析排序的過程,理解冒泡排序算法的基本思想。
3.2通過PPT動畫分解排序步驟
以任務(wù)實(shí)例的形式講解冒泡排序的基本思想,有5名學(xué)生的成績?nèi)缦拢?4、51、73、95、62,現(xiàn)要求對成績序列進(jìn)行升序排列,即51、62、73、84、95。
(1)分析排序過程
由于播放的排序動畫/視頻相對較快,教師再結(jié)合PPT課件上設(shè)計(jì)的動畫,動態(tài)演示數(shù)據(jù)的每一步交換的過程。在逐步播放動畫的過程中,教師引導(dǎo)學(xué)生總結(jié)每一次的比較和交換過程。
①第1趟排序:
第1次:先比較84和51,若前面的數(shù)大于后面的數(shù),則交換兩數(shù),否則不交換。因84大于51,所以交換兩數(shù)。排序后的序列為:51 84 73 95 62
第2次:比較84和73,因84大于73,所以交換兩數(shù)。排序后的序列為:51 73 84 95 62
第3次:比較84和95,因84小于95,所以不交換。排序后的序列仍為:51 73 84 95 62
第4次:比較95和62,因95大于62,所以交換兩數(shù)。排序后的序列為:51 73 84 62 95
結(jié)合前面的PPT動畫,教師引導(dǎo)學(xué)生分析問題并總結(jié)規(guī)律。
【提出問題】:第1趟排序一共進(jìn)行幾次比較?排序結(jié)束后的數(shù)據(jù)序列有什么規(guī)律?
第1趟排序共進(jìn)行了4次比較,排序結(jié)束后找到了5個(gè)數(shù)據(jù)中的最大數(shù),95沉在最下方。
【提出問題】:如此看來,若要對5個(gè)數(shù)據(jù)進(jìn)行升序排列,還需要進(jìn)行幾趟排序呢?每一趟又要進(jìn)行幾次的兩兩比較?
帶著上述問題,繼續(xù)觀看PPT動畫,分析第2趟排序過程。
②第2趟排序:
待排序的數(shù)據(jù)序列為:51 73 84 62。結(jié)合PPT動畫,教師引導(dǎo)學(xué)生分析每一次的比較、交換過程。
【提出問題】:第2趟排序過程進(jìn)行幾次比較?還需進(jìn)行幾趟的排序?
第2趟排序進(jìn)行3次的兩兩比較,找到了4個(gè)數(shù)中的最大數(shù)84,還需要進(jìn)行兩趟的排序。
③第3趟排序:
待排序的數(shù)據(jù)序列為:51 73 62。結(jié)合PPT動畫,引導(dǎo)學(xué)生分析問題、總結(jié)規(guī)律。
【提出問題】:第3趟排序過程進(jìn)行幾次比較?還需進(jìn)行幾趟的排序?
第3趟排序進(jìn)行2次的兩兩比較,找到了3個(gè)數(shù)中的最大數(shù)73,還需要進(jìn)行一趟的排序。
④第4趟排序:
待排序的數(shù)據(jù)序列為:51 62。結(jié)合PPT動畫,引導(dǎo)學(xué)生分析問題、總結(jié)規(guī)律。
【提出問題】:第4趟排序過程進(jìn)行幾次比較?
第4趟排序進(jìn)行了1次比較,找到兩個(gè)數(shù)中的較大數(shù)62。
在整個(gè)分析過程中,老師借助PPT動畫,使用問題逐步引導(dǎo)學(xué)生,讓學(xué)生歸納總結(jié),得出結(jié)論,大大提高了學(xué)生在課堂上的參與性,學(xué)習(xí)積極性也增強(qiáng)了。
(2)總結(jié)規(guī)律
由此可得,若要對5個(gè)數(shù)進(jìn)行升序排列,需要進(jìn)行4趟排序。若用i表示趟數(shù),則每一趟要比較的次數(shù)為4-i次。
表1 排序過程
【提出問題】:若要對N個(gè)數(shù)進(jìn)行升序排列,需要進(jìn)行幾趟排序呢?每一趟進(jìn)行幾次比較?
在教師的引導(dǎo)下,結(jié)合PPT課件,教師和學(xué)生一起總結(jié)規(guī)律。
【概括歸納】:若對N個(gè)數(shù)進(jìn)行排序,要排序的趟數(shù)是N-1趟;每趟比較N-1-i次;每趟都是對相鄰的兩個(gè)數(shù)進(jìn)行比較,如果前面的數(shù)比后面的數(shù)大就交換[4]。
3.3代碼演示與分析
經(jīng)分析,大海子水庫內(nèi)部收益率11.25%,大于社會折現(xiàn)率8.0%,且效益費(fèi)用比1.1,初步概算該工程在經(jīng)濟(jì)上是合理的。
運(yùn)用數(shù)組存儲5個(gè)成績,并通過冒泡排序算法對其進(jìn)行排序。定義一個(gè)整型數(shù)組int a[5],則數(shù)組元素a [0]~a[4]]分別存儲的成績?yōu)椋?4,51,73,95,63。
若用變量i表示趟數(shù),用j表示每一趟比較的次數(shù),結(jié)合PPT動畫,通過觀察得知:
第1趟:兩兩比較4次
趟數(shù)i=0:for(j=0;j<=3;j++)if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}
第2趟:兩兩比較3次
趟數(shù)i=1:for(j=0;j<=2;j++)
if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}
第3趟:兩兩比較2次
if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}
第4趟:兩兩比較1次
趟數(shù)i=3:for(j=0;j<=0;j++)
if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a [j+1]=t;}
【提出問題】:觀察以上4趟排序的程序代碼,有什么共同/不同的地方?
每趟排序都經(jīng)歷了多次比較、交換的過程,均使用for循環(huán)來實(shí)現(xiàn)。觀察4個(gè)for循環(huán)語句可知,每趟的程序結(jié)構(gòu)相同,這就意味著這個(gè)比較、交換的for循環(huán)結(jié)構(gòu)將作為循環(huán)體被執(zhí)行4趟,同樣的,采用for循環(huán)語句for(i=0;i<4;i++)來實(shí)現(xiàn)。4個(gè)for循環(huán)語句唯一不同的地方是for語句的第2個(gè)表達(dá)式,通過觀察和分析,學(xué)生找到了規(guī)律,可以用表達(dá)式j(luò)<4-i;來表示,即for(j=0; i<4-i;j++)。由此可知,冒泡排序是一種雙重循環(huán),外層循環(huán)控制趟數(shù),內(nèi)層循環(huán)控制比較的次數(shù)。
借助PPT動畫有層次地列出排序的主要代碼:
for(i=0;i<4;i++)/*外循環(huán):趟數(shù),表達(dá)式2也可寫為i<=3 */
for(j=0;j<4-i;j++)/*內(nèi)循環(huán):每一趟比較的次數(shù),表達(dá)式2也可寫為j<=3-i */
if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;} /*比較、交換*/
【提出問題】:雙重循環(huán)中,外循環(huán)的變量i的初值可否寫成1呢?
教師引導(dǎo)學(xué)生分析程序的執(zhí)行過程,并解釋循環(huán)變量i和j的關(guān)系,然后修改程序。
以上程序段還可寫成:
for(i=1;i<5;i++)/*外循環(huán):趟數(shù),表達(dá)式2也可寫為i<=4 */
for(j=0;j<5-i;j++)/*內(nèi)循環(huán):每一趟比較的次數(shù),表達(dá)式2也可寫為j<=4-i */
if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;} /*比較、交換*/
【提出問題】:對N個(gè)數(shù)進(jìn)行升序排序,如何編寫代碼?
觀察以上程序代碼,總結(jié)趟數(shù)i和次數(shù)j的關(guān)系/規(guī)律,二者的關(guān)系如表2所示。
表2 趟數(shù)i和次數(shù)j的關(guān)系
掌握了趟數(shù)i和次數(shù)j的關(guān)系后,為了使學(xué)生理解和識記冒泡排序的程序代碼,結(jié)合該排序?qū)嵗?,教師總結(jié)了以下口訣:排序N-1趟;每趟從前往后比較;相鄰兩個(gè)比較;順序不對就交換[5]。
教師在講解時(shí),每念一句口訣,在黑板上列出相應(yīng)代碼:
for(i=1;i<=N-1;i++)/*排序N-1趟*/
for(j=0;j<=N-1-i;j++)/*每趟從前往后比較*/
if(a[j]>a[j+1])/*相鄰兩個(gè)比較*/
{t=a[j];a[j]=a[j+1];a[j+1]=t;} /*順序不對就交換*/
以上規(guī)律和口訣簡潔易記,重點(diǎn)突出,高度概括了冒泡排序,便于學(xué)生理解冒泡排序算法的實(shí)現(xiàn)過程。學(xué)生在寫程序時(shí)只需按照以上規(guī)律和口訣進(jìn)行代碼編寫,簡單易行。然后再結(jié)合具體的數(shù)據(jù)實(shí)例,讓學(xué)生分析程序的執(zhí)行過程,大大提高了學(xué)生的理解和認(rèn)知能力。
【拓展應(yīng)用】:如果要對N個(gè)數(shù)進(jìn)行降序排列,如何編寫代碼?
在理解以上規(guī)律和口訣的基礎(chǔ)上,學(xué)生可以很快編寫出以下程序:
for(i=1;i<=N-1;i++)/*排序N-1趟*/
for(j=0;j<=N-1-i;j++)/*每趟從前往后比較*/
if(a[j]<a[j+1])/*相鄰兩個(gè)比較*/
{t=a[j];a[j]=a[j+1];a[j+1]=t;} /*順序不對就交換*/
【拓展應(yīng)用】:如何在VC++編譯器中編寫完整程序代碼,將65名學(xué)生的成績升序輸出?
冒泡排序的主要代碼熟記后,學(xué)生要靈活運(yùn)用冒泡排序算法,嘗試編寫完整的程序段。教師引導(dǎo)學(xué)生梳理程序的定義、輸入、處理(排序)、輸出4個(gè)步驟,然后通過PPT課件呈現(xiàn)完整的程序段,學(xué)生需要在下節(jié)實(shí)驗(yàn)課上加以鞏固、實(shí)踐。
3.4引導(dǎo)學(xué)生改進(jìn)算法,培養(yǎng)發(fā)散思維
在教學(xué)過程中讓學(xué)生掌握知識點(diǎn)和理解算法很重要,同時(shí)引導(dǎo)學(xué)生發(fā)現(xiàn)算法設(shè)計(jì)中的存在的問題或不完善的地方,由此探索改進(jìn)方法,也是教學(xué)的重要目的之一。
觀察分析排序過程的表1可發(fā)現(xiàn),最后一趟排序未進(jìn)行數(shù)據(jù)交換,是個(gè)“空操作”。由此可看出,不論初始數(shù)據(jù)序列如何,都要比較N-1趟。而在實(shí)際序列中,如果某趟排序并未進(jìn)行數(shù)據(jù)交換,說明待排序列已經(jīng)是有序序列,則沒必要繼續(xù)循環(huán)了。因此,可以設(shè)一個(gè)標(biāo)志變量flag[6],若有交換,則flag=1;若無交換,則flag=0。這樣就可以根據(jù)flag的值來決定是否跳出循環(huán),結(jié)束排序,以避免無交換的多余趟排序。由此可知,當(dāng)待排序的數(shù)據(jù)序列基本有序時(shí),增設(shè)標(biāo)志變量可以有效降低傳統(tǒng)冒泡排序算法的時(shí)間復(fù)雜度,提高了算法的效率[7]。
改進(jìn)后的冒泡排序程序代碼如下:
for(i=0;i<N-1;i++)/*排序N-1趟*/
{ flag=0;
for(j=0;j<N-1-i;j++)/*每趟從前往后比較*/
if(a[j]>a[j+1])/*相鄰兩個(gè)比較*/
{ t=a[j];a[j]=a[j+1];a[j+1]=t; /*順序不對就交換*/
flag=1;}
if(flag==0)break;
}
現(xiàn)代教育注重培養(yǎng)學(xué)生的創(chuàng)造性思維,相對于知識的講授而言,更重要的是讓學(xué)生掌握思維方式,發(fā)散思維就是創(chuàng)造性思維的一種。通過上面的講解,引導(dǎo)學(xué)生意識到冒泡排序算法仍有不完善的地方,進(jìn)一步啟發(fā)學(xué)生改進(jìn)算法。從而引申出其他排序算法比如選擇排序、快速排序等,使學(xué)生能真正掌握排序算法的基本原理和思想,培養(yǎng)學(xué)生發(fā)現(xiàn)問題、解決問題的能力,提高學(xué)生的獨(dú)立思考能力和發(fā)散思維能力。
本文以冒泡排序設(shè)計(jì)教學(xué)為例,利用視頻、PPT等多媒體教學(xué)手段,使用問題引導(dǎo)教學(xué),并結(jié)合口訣教學(xué)法等,形象生動地向?qū)W生展示了冒泡排序的基本思想和變換過程。一方面調(diào)動了學(xué)生學(xué)習(xí)的積極性,使學(xué)生順利地從排序的思想、步驟的總結(jié)過渡到代碼的書寫,更好地掌握了冒泡排序算法;另一方面通過問題引導(dǎo)教學(xué),激發(fā)了學(xué)生學(xué)習(xí)的熱情,提高了學(xué)生發(fā)現(xiàn)問題和解決問題的能力,培養(yǎng)發(fā)散思維能力。因此,這種合理的教學(xué)設(shè)計(jì)有效地提高了教學(xué)效果,對程序設(shè)計(jì)類課程的教學(xué)有一定借鑒意義。
參考文獻(xiàn):
[1]丁亞濤. C語言程序設(shè)計(jì)(第3版)[M].北京:高等教育出版社,2014:149-152.
[2]楊波.梁少林.C語言中冒泡排序算法的教學(xué)設(shè)計(jì)與分析[J].信息與電腦,2015(16):180-181.
[3]梁旭玲. C語言排序算法的分析和總結(jié)[J].電腦知識與技術(shù),2010,6(18):5041.
[4]謝翠萍.陳家益.朱兵章.C語言中冒泡排序教學(xué)設(shè)計(jì)與分析[J].福建電腦,2013(5):50-51.
[5]薛輝.冒泡排序的口訣教學(xué)法[J].陜西教育(高教版),2012,5:103-104.
[6]宋美英.基于C語言的冒泡排序算法探討[J].現(xiàn)代計(jì)算機(jī),2011,12:48-49.
[7]楊曉明.一種基于冒泡排序法的改進(jìn)算法[J].電子測試,2014.5:48-49.
Design and Analysis of Bubble Sort Algorithm in C Language Teaching
CHENG Ni
(Department of Public Computer Teaching,Yuncheng University,Yuncheng 044000)
Abstract:Bubble sort algorithm is the important and difficult points of C language teaching in colleges and universities, but the effect of the traditional teaching method is not ideal. Discusses the design of teaching procedure that using the multimedia teaching means, the question guiding teaching method and formula method. The design of teaching procedure greatly stimulates the interest of students' learning, makes the students to better grasp the principle of bubble sort algorithm, cultivates the students' independent thinking ability and divergent thinking ability, achieves a good teaching effect.
Keywords:Algorithm; Bubble Sort; Question Guiding; Formula; Divergent Thinking
收稿日期:2016-02-02修稿日期:2016-03-10
作者簡介:程妮(1986-),女,山西運(yùn)城人,碩士研究生,助教,研究方向?yàn)橛?jì)算機(jī)應(yīng)用技術(shù)
文章編號:1007-1423(2016)10-0059-05
DOI:10.3969/j.issn.1007-1423.2016.10.014
基金項(xiàng)目:2014年運(yùn)城學(xué)院教學(xué)改革項(xiàng)目(No.JG201429)、2014年山西省高等學(xué)校教學(xué)改革項(xiàng)目(No.J2014106)