「但妳好像沒提過要我學這個啊?」勇者困惑的說。
「不學演算法和資料結構也可以寫程式。」蕭凱琪不在意地擺擺手,但勇者還是一臉不相信,所以只好說出來差別:「⋯⋯但如果學得好就可以把同樣的功能寫的效能特別好,省時省記憶體空間,所以公司會在意也是正常的,但我覺得為了考試瘋狂刷題是有些過度了。」
蕭凱琪嘆氣:「我自己寫著玩的時候是喜歡看效能一次比一次好,但一直刷一直刷就有點煩躁了。」
勇者想到自己為了維持能力的那些艱苦枯燥的跑步、揮劍訓練,也就可以理解蕭凱琪的想法了。「妳要不要試試交叉訓練?就是在特定訓練週期中安排不同類型的訓練,或是以和他人競賽的方式進行?」
蕭凱琪先是一愣,接著馬上思考了可行性,笑了一下:「這倒是不錯的想法。希望你之後還能記得這麼做。」她在心裡說完剩下的話——不要在生活和工作的傾軋中迷失本心。
勇者沈默了一下。
蕭凱琪也沒打算繼續這個話題。「好了,在看程式碼之前,我先來說明氣泡排序的原理。讓程式連續比較陣列裡相鄰的兩個數字,讓數字大的交換到後面那個格子。第一輪結束後,就能保證最後面格子裡的是最大的數字,第二輪結束就能保證倒數第二格子裡的是第二大的數字,以此類推。」
勇者聽完後想了一下:「所以就是有幾個數字,就有幾輪囉?」
蕭凱琪回應:「這不一定唷,如果是最好的情形,也就是數字的原始順序已經和我們的目標一樣,我們只需要一輪就能完成,把數量命名為n的話,時間複雜度可以表達成Θ(n),這是因為每輪的長度也是和數字的數量有關。而最糟的情形發生在數字的原始順序剛好和我們的目標相反,時間複雜度可以表達成O(n^2),換句話說就是每輪幾乎每個數字都交換了位置。」
「後者聽著很慘。」勇者笑了。
「對呀,只要資料量一大,花的時間馬上暴增,所以不會用於商用,但因為它的原理很好理解和實作,所以是課堂教學上經典的排序法。」
看著氣泡排序短短不到二十行的程式碼,再回頭看「DualPivotQuicksort」的「sort」函式接近一百行的程式碼,勇者再一次同意蕭凱琪的說法,真的很好實作。