小小熊學C++(故事版)第八章:海盜來襲(下)

(續)

小艾說:“簡單的說,演算法就是為了解決一定問題而進行的一系列的指令。那麼排序演算法當然就是解決排序問題的一些指令集合了。排序演算法有很多種,像氣泡排序,選擇排序,插入排序等等,這裡我們可以選擇一種比較好理解的簡單的氣泡排序來處理。”

氣泡排序可以說是比較簡單的一種排序方法,以“從大到小”排序(沉底法)為例:

1、先比較兩個相鄰的數,按“從大到小”排列,大數在前,小數在後,如果如果第二個比第一個大,就交換兩個數,始終保持按“從大到小”排列;

2、然後把篩選出來的那個較小的數再和它後面的數比較。每一對相鄰數都做同樣的工作,從開始第一對到結尾的最後一對,這樣交換排序後,最後的數應該會是最小的數。

3、除了最後一個已經篩選出來的最小的數以外,針對剩餘的數重複以上的步驟;

4、持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較,則數列排序完成。

這個過程就好像是水裡的氣泡,氣泡越大,在水裡的浮力越大,上升的速度也就越快(如圖),所以把這種排序形象地稱為“氣泡排序”。順序相反則稱為“沉底法”,先讓小的氣泡沉到底部去。

小小熊學C++(故事版)第八章:海盜來襲(下)

小艾說:“我們再來看看海盜頭子出的這道題,如果使用氣泡排序,他們是如何交換的呢?如果想使用程式完成,需要仔細分析演算法執行過程,找到程式程式碼的關鍵點。先看看這個動畫圖。”

小小熊學C++(故事版)第八章:海盜來襲(下)

透過動畫圖演示,小夥伴們已經知道了“氣泡排序”大致需要比較幾輪,每輪又需要比較若干次。那麼如何書寫程式碼呢?

“這需要兩層迴圈來完成?”朱迪搶著說。

“對,所以需要兩個迴圈巢狀實現,”小艾滿意地說,“好在迴圈語句我們以前都已經掌握了,現在只需要稍作練習一下就可以掌握了。比如輸出一個‘九九表’,像這樣…”

說著,小艾給出了一個“九九表”的圖片。

小小熊學C++(故事版)第八章:海盜來襲(下)

“試試看,如何輸出這個‘九九表’呢?”小艾問。

小奧說:“輸出9行9列的‘九九表’應該很簡單吧,比如這樣寫…”

小小熊學C++(故事版)第八章:海盜來襲(下)

執行結果如圖所示。

小小熊學C++(故事版)第八章:海盜來襲(下)

可是如果只是輸出左下角的斜三角矩陣,那麼應該如何書寫程式碼呢?

小奧說:“看來還是需要9行,但是需要修改每行輸出的列數。”

本習慣性的摸摸腦袋,“那該修改哪個地方的程式碼呢?真是頭疼!”

朱迪說:“還是像以前一樣,試著分析下程式碼,理清下思路吧。”

大家都點頭同意,於是列出了下面的重點程式碼,分析了起來。

小小熊學C++(故事版)第八章:海盜來襲(下)

第一行程式碼是控制行數的,不需要變動;第二行程式碼是控制每一行輸出的列數,需要改動下,可是改動哪個位置的程式碼會對輸出的次數產生影響呢?

奧卡經過仔細觀察,指出了兩個會影響輸出次數的語句,如圖所示。

小小熊學C++(故事版)第八章:海盜來襲(下)

看來只需要調整這兩個語句就可以了。

“而且看起來好像斜三角矩陣裡面的每一行輸出的列數跟行數是有某種特定關係的?”朱迪說。

“沒錯,第一行輸出一列,第二行輸出兩列,…,以此類推,第九行輸出九列。行數與該行輸出的列數是一樣的,”本說。

“所以,是不是可以這樣修改呢?”奧卡說著,列舉出相應的程式碼:(參考程式碼8-1)

小小熊學C++(故事版)第八章:海盜來襲(下)

輸入後執行成功,大家都非常高興。(聰明的你也想到了吧!)

小夥伴們成功輸出了“九九表”後,兩層迴圈的語法基本掌握了。接下來可以使用同樣的方式分析海盜排隊這道謎題了。

那麼這道謎題到底需要迴圈多少輪,每輪多少次呢?(參考前面的動畫,試著分析下吧,把程式碼模板寫出來。如果實在不行,可以看看下面的動畫演示。)

小小熊學C++(故事版)第八章:海盜來襲(下)

分析出來程式碼模板,接下來就可以寫程式了,程式碼如下:(試著把它填寫完整吧)

小小熊學C++(故事版)第八章:海盜來襲(下)

小小熊學C++(故事版)第八章:海盜來襲(下)

執行結果如圖:

小小熊學C++(故事版)第八章:海盜來襲(下)

“現在我們明白了這個‘氣泡排序演算法’的整個思路,並可以根據思路整理出相應的程式碼模板,這才算是完成了演算法程式碼的最後開發。” 小艾滿意地說,“而且這個程式碼可以根據參加排隊的海盜人數,自動計算交換的次數,非常棒!”

這時的海灘上的海盜們已經四分五散,看來是餓的受不了都去找吃的去了,只留下那個最小的小海盜一個人坐在那兒裡低頭抽泣。

於是大夥趁著其它海盜們不注意,快速得靠近那個小海盜,和他打招呼:“hi,小兄弟!”

小海盜吃驚的抬起頭,看見了眼前的小夥伴們,問道:“你們是誰?”

小夥伴們說:“我們也是船隻失事了,漂泊到這個荒島上。”

小海盜看看三個小夥伴,又驚恐地看看四周說:“那你們快點走吧,如果被其他的海盜看見就不得了啦!”

看來這個小海盜心地還是很善良的,小夥伴們更加想幫助他了,於是大家說:“你肚子餓不餓?”

小海盜邊抽泣邊說:“我是個孤兒,被他們逼著入夥當了海盜。前幾天我們的船失事沉沒了,糧食都沒了,大家已經很長時間沒吃東西了,只好挖野菜度日。”

大夥看見小海盜面有飢色,應該說的是實話,於是問他:“海盜頭子的題你做出來了嗎?”小海盜無奈地搖搖頭。

小夥伴們說:“我們告訴你答案吧,你快去海盜頭子那裡拿口糧充飢。”說完,大家告訴了小海盜的解題方法和答案,小海盜高興壞了,向小夥伴們表示了感謝之後,快速地向海盜頭子憩息的樹林跑去。

(版權所有 微博@小小熊爸比,分享或轉載前請標明出處!)

故事後記:

1)排序演算法有多少種?去搜索下,並瞭解下它們之間的區別。

2)故事中的排序演算法是按從大到小排列的“沉底法”,如果想按從小到大排列(也就是“冒泡法”),該如何調整程式碼?

3)故事中的“九九表”如果想輸出右上方的斜三角矩陣,該如何調整程式碼呢?

小小熊學C++(故事版)第八章:海盜來襲(下)