本系列文章同步分享於個人Blog → Informistry-HankLee
一連講了五天的背景知識,今天我們終於要來開始上主菜了,而主菜也是有很多的類別:
在我們這30天的系列中,我們也會針對這七個類別中一些比較基礎的演算法進行介紹,今天的主題是Brute Force中的Selection Sort。
Brute Force就是針對要解決的問題,用最『直接』的方始去取得結果,我個人覺得最簡單的說法就是暴力破解,例如要計算某個數值X的n次方,那就真的去把X乘n次、或者是要從一堆資料中找出某一筆資料,就把這堆資料中每一個資料都拿出來比對。那可能會有人覺得:『既然是暴力破解法,那Brute Force沒什麼特別的啊,幹嘛要特別說?!』,至少我曾經這麼想過,但是我覺得就是因為Brute Force沒什麼特別的,所以我自己認為他是演算法的『源頭』,藉由了解最原始的做法,才能知道未來演變出的演算法的優勢及好處。
其實要了解一個演算法,透過 排序(Sort)及搜尋(Search) 大概會是最容易的方式了,今天我們就來介紹第一個屬於Brute Force的演算法--Selection Sort,既然名字都已經有Sort
了,自然表示這個演算法的目的是用在排序
,基本上這個演算法的步驟為下:
最小的值
,然後把這個最小的值換到第一個位置
。從第二個數值位置
開始搜尋整個數列,一樣尋找最小的值
,然後把這次找到的最小的值換到第二個位置
。對,這個Selection sort就是這麼的簡單,沒有複雜的流程,沒有複雜的理論,非常簡顯易懂,那Pseudo-code則是下面這樣:
// Input: An array Array[0...n-1] of orderable elements
// Output: An array Array[0...n-1] sorted in ascending order
function SelectionSort(Array[0, ..., n-1]){
for i = 0 to n-2 do:
min = i
for j = i + 1 to n-1 do:
if Array[j] < Array[min]:
min = j
end if
end for
SWAP Array[i] and Array[min]
end for
}
在講Selection Sort的時間複雜度之前,我們先透過一張GIF來『視覺化』Selection Sort的步驟吧。
從上面的GIF可以看到,短短一個長度為8的陣列,在進行Selection Sort的時候,就會需要進行數值大小比較28次和數值交換7次,也就是說,透過Selection Sort每跑一次長度為n的陣列,就需要進行接近n^2/2次
的數值比較和n-1次
的數值交換,另外,從Pseudo-code中可以看到跑一次Selection Sort會跑兩次執行時間決定於n的大小的巢狀迴圈,因此其時間複雜度為O(n^2)
;而對於Selection Sort而言,Best Case、Average Case和Worst Case的時間複雜度都是O(n^2)
。
O(n^2)
,而寫入數據(reads)次數為O(n)
。明天我們將會介紹第二個屬於Brute Force的演算法-Bubble Sort。