信息技術課程講求知識的內在聯系和思維的生成,這就需要關注學生的學習過程,在探索中發現、思考和解決問題,從而培養學生的創新能力。因此,教師必須從學習者的角度出發,認真探索課程內容,對課堂做出自己的預設,并在實際教學中生成并修改,以期達到最好的教學效果。
本節課是“簡單排序”的第5個課時,是一堂信息學研討課,主要的知識點是快速排序。學生已經對計數、插入、選擇和冒泡排序進行了學習,初步掌握了簡單排序的算法,并能應用于實際問題。
我先通過一道競賽真題(NOIP2007提高組的第1題統計數字)引入,讓學生結合已學的排序算法思考求解。有的學生說直接用已學的選擇或插入排序算法來做;有的學生在分析題目時便發現題目給出的數據最大可達到200000,而之前學的排序算法的時間復雜度是O(n^2),簡單一算發現超時。這個環節本意是讓學生發現數據范圍的問題,從而尋求效率更高的排序算法,但是也發現了一部分學生不能認真審題,盲目做題(審題,即觀察問題,這是一切有效思考的基礎)。由此,我自然引出本課的主題——快速排序,它是一種時間復雜度O(nlog2n)的排序算法,然后先學習快速排序“是什么”,在此基礎上尋找快速排序“為什么快速”的答案。
首先,我給出了快速排序的思想,讓學生有一個總體的把握;接著闡述了一次快速排序的算法,使學生了解具體的做法和步驟。這時,學生產生了疑問:這樣就能實現“排序”嗎?于是,我用一組數據在課件上動態模擬(如圖1、圖2),展現快速排序的一次劃分過程,學生對算法的開始、關鍵步驟、結束條件等產生直觀的認識。
這時就繼續講解快速排序的具體程序嗎?學生能根據程序自己揣摩消化嗎?在備課過程中,我發現了一些問題,覺得可以作為突破口引導學生“重新發現”和深入理解快速排序。內涵理解了,具體程序是水到渠成的(在備課過程中,教師要以學習者的角色發現問題提出疑問,不能人云亦云,自己探索才能引導學生探索)。
我預設了兩個課堂問題:①基準元素A[3]已放在目標位置,應該以A[3]為基準將數據分為A[1]~A[2],A[4]~A[8]兩部分嗎?②I和J指針最后是由I 在學生思考、討論的基礎上,我通過一個例子具體演示這兩個問題的解決過程,并與學生共同得出結論:①基準元素最后的位置是不確定的,未必放到目標位置,因此劃分中必須將基準元素包括在內。②I=J時數據已完成一次劃分,但為了方便調用子序列繼續快排,仍多做一次,統一為I>J時退出。接著,我進一步提出疑問:在什么情況下基準元素放在目標位置,且不參與下次劃分?這是上述第一個問題的后續問題,同樣需要找例子證明自己的觀點,有助于學生思維的深入發展。大多數學生能較快地找出反例,并模擬出全過程。(課堂中問題的提出要具有連貫性和邏輯性,不能泛泛而問,要從探究的知識內部找問題,關注學生認知能力的發展) 經過上述多個環節的思考、質疑和討論,這里水到渠成地給出快速排序算法的程序實現(當然也可以嘗試讓學生自己先寫,再給出完整程序,可能效果更好,因課堂時間問題未這樣操作),學生都能夠較快地理解和掌握程序的書寫,而不是死記硬背式的,并順勢編程解決了例題。大部分學生完成例題的求解后,我繼續提出疑問:基準元素取法不同,對算法效率是否有影響?從而引出對快速排序算法效率的分析,這是本節課的一個難點問題。有學生認為取中間數和取其他數效率一樣,有學生認為可能會有影響,但是找不到合適的方式進行表達和研究。這時教師給出提示:還是根據實際例子來分析,并以“1,2,3,4,5”這樣一組簡單的數據為例,讓學生畫圖思考分析(如圖3、圖4)。 以中間數3為基準,要做幾次劃分,交換多少次…… 以開頭的1為基準,要做幾次劃分,交換多少次…… 但以中間數為基準元素就一定是最好的嗎?學生A馬上說:待排序的數不是按照順序給出就不行了。此時,教師正好提出可以有效提高快速排序的平均性能的做法——隨機選取基準數,并順便介紹一下隨機化算法(要善于啟發學生,拓展學生的視野)。以此為突破口,師生共同對快速排序算法的最好情況、最壞情況、平均性能、空間復雜度、穩定性等進行了分析。在分析快速排序算法的不穩定性時,我提出疑問:如果有的題目必須要用快排,但是題目中要求穩定性,如何針對題目對快排進行穩定性改造呢?并給出待解決的競賽真題“分數線劃定”讓學生思考解決。(學生在前面已學過選擇排序的穩定性改造,這里旨在鍛煉學生舉一反三的能力) 最后給出快速排序算法的一個應用:第k小數。即對快速排序算法進行局部改造,創造性地解決問題。這里我先讓學生思考、討論,然后給出了一些提示:直接先快排再按照順序找第k小數是最直接的做法,但是如何在快排原始算法中加入第k小數的判斷?是否可以加入一個參數?這樣自然引導學生實現應用。(所學知識的應用核心,它是在簡單的模仿、理解和使用的基礎進行創造性實驗,旨在培養學生創新思維能力) 在課后作業中,我給出一道與第k小數應用相關的思考題和5道練習題。布置思考題是讓學有余力的學生展開后續的深入研究,練習題是讓全體學生在課后對所學內容進行消化吸收,在多次的解題實踐中實現能力的升華。通過后續的解題實踐發現,學生對快速排序的理解比較深入,不是簡單地記下來和套用,而是把快速排序作為人類的一種思想進行重新發現和思考,攻克前人在發明過程中的一個個難題(實際上這個算法也是通過多位前人逐步豐富和完善的,未來可能還會繼續更新),真正理解快速排序是“如何快速”的,并實現新的應用和創造。 點 評 該課內容是比較枯燥難懂的,如果只是讓學生把算法背下來,然后在練習中不斷提高和檢查學生對其的掌握度,那么就是純粹的“應試教育”了。其實,我們學習的內容都是有趣的——但需要一個基礎:教師必須對課程內容進行深入的探索,通過對比、分析、反思等各種方式掌握課程的核心,擁有廣闊的專業視野和敬業精神。顯然本課的教師對快速排序進行了較為深入的研究,他也是一個學習者,在對前人的成果進行細致考察的時候,發現了一個個難點和疑點,從而將其預設為課堂問題,與學生共同研討質疑并產生火花。按照問題探究的過程,順著思維發展的軌跡,整個課堂教學過程一步步生成出來,對知識的學習本身是一種創新,那么最后對知識的應用與創造便是水到渠成的了,這是“真理”發現之路。 (陳茂賢 廣東省佛山市南海區教育局教研室)