這邊要先簡單介紹一下時間複雜度的概念 ,因為對演算法來說都是以執行的次數來做比較 ,那時間複雜度就是一個很好判斷演算法的好壞的一個指標,在實際上時間複雜度只表示實際次數的一個量度層級。那通常會以大O這個符號來代表一個區間的上限 ,什麼意思呢?因為再看一個演算法時 ,我們只會看最高項數而忽略不看後面接的項數 ,因為當n越大時 ,最高項數給的影響會越大 。
所以像是O( n²) 這個時間複雜度, n²+100n+100000和 n²+n+1都是屬於同個區間也就是O( n²),那假如要詳細了解的話,可以看我的演算法筆記(二)來了解喔。
O( n²) : 插入排序法(Insertion sort)
插入排序法是一個很常見的排序法,舉一個例子來說,就是玩撲克牌時,你要整牌時,把牌照大小順序排好的做法。
通常會有3個前置動作:
- 拿一個要處理的數字的index(假設為[i])。
- [j]為已經排序好的數列最後一個index,j會一直做減法,來保證[j]前面的數列比新要比的數要小,才能保證排序好了。
- 建一個key來儲存目前要處理的數字,避免被array[i]覆蓋掉。
那插入排序法很重要的前提就是,假如排序好的數列最後的index大於key(array[j]>key),array[j]就要往後移,然後繼續進行j的減法,直到 j=-1了,代表超過矩陣的長度也檢查好0~i-1的矩陣了。
當跳出時,會把[j+1]=key,為什麼呢?因為前面有假設兩個狀況,一個狀況代表已經檢查到盡頭了,沒有比我小的數字了,這時j=-1,把它加1,放進去矩陣的開頭[0],或者是另一個狀況,key有大於[j]的狀況,那把它放在它後面就是[j+1],那會重複這個動作,直到整個矩陣被檢查完。
貼心提醒要開啟旁邊的file裡面才有另一個class喔。
附上程式碼讓大家參考喔 (*´∀`)~♥
O(n log n):合併排序法(Merge sort)
時間複雜度為 O(n log n) 的演算法,代表著執行時間會隨著以二為底的 log n 再乘上 n 成長,通常會以合併排序法較常見,而快速排序法,會在演算法筆記(二)中紀錄。
合併排序法(先拆分再合併)
- 拆分就是從中間切一半後,再切切到底,直到都剩一個方塊為止,-而拆分的時間複雜度,為n-1的次數,為O(n)。
- 在合併時,就要進行排序了,不過排序時是稍嫌複雜,因為兩個小矩陣要合併成一個新的矩陣,我們需要比較兩個矩陣的第一個數字,較小的就把丟 進一個新的矩陣,直到兩個矩陣都被比較完。
- 那假如有比較極端的狀況發生,像是第一個小矩陣的都很大,全部被丟完了,那怎麼辦?別擔心,因為矩陣要合併時, 都進行過比大小了,所以只要 直接把第二個小矩陣的數字, 全部丟進新矩陣的後面就好 。
- 在合併的時間複雜度上,每次的合併需要O(n),總共需要O(log n),拆分和合併乘起來,就是時間複雜度O(n log n)。
- 在程式碼的部分,因為大量使用遞迴的概念,所以會稍嫌困難。
return Merge(mergesort(left), mergesort(right));
這邊是非常重要的遞迴概念,在看完程式碼後,再來看這段會很有感覺的,這邊簡單的說是先執行拆分的動作,拆分到底後,呼叫另一段函式,進行合併。
貼心提醒要開啟旁邊的file裡面才有另一個class喔。
最後還是附上程式碼讓大家參考喔 (*´∀`)~♥
總結
希望這些程式碼對大家有所幫助,假如能夠讓大家有所領悟的話,可以幫我按like讓我可以賺咖啡錢喔,我會很開心的 (ゝ∀・)。