<演算法圖鑑>心得筆記-第二章

IgorChien
5 min readSep 9, 2020

--

前言

閱讀學習後紀錄下來,以增加自己的記憶及分享學習心得。

何謂排序

排序的英文是sort,意思就是將輸入的數由小到大或由大到小重新排列。

氣泡排序

亦稱泡沫排序』,反覆進行「由右往左,將相鄰的數兩倆相比後重新排列」的操作。

Bubble Sort
使用氣泡排序的執行時間氣泡排序的比較次數是,第一回合n-1次、第二回合n-2次······到第n-1回的1次。比較的總次數是(n-1)+(n-2)+······+1=n²/2。比較總次數與數據的排列順序無關,與輸入的數據有關。最極端的情況是數據由小到大排列,且完全不必重新排列;反之,若數據是由大到小排列時,每次比較後都需要做對調,則執行時間是 O(n²)。

選擇排序

反覆進行「搜尋數列中的最小值,將它與最左邊的數對調」的操作。搜尋數列中的最小值使用線性搜尋。

Selection Sort
使用選擇排序的執行時間因為選擇排序使用線性搜尋,比較次數是第一回合n-1次、第二回合n-2次······到第 n-1回的1次。因此比較的總次數與氣泡排序相同。每回合最多把兩個數對調1次,所以選擇排序的執行時間與氣泡排序一樣是 O(n²)。

插入排序

從數列的左邊開始,往右依序排序下去。開始排序時可以把它分為兩個區塊,分別是左邊的『排序已完成』區塊及右邊的『排序未完成』區塊。
每回合由右邊區塊中的第一個數與左邊區塊的數做比較,並插入到左邊區塊中的適當位置。

Insertion Sort
使用插入排序的執行時間插入排序是將每回合取出的數,與它左側的數比較。如左側的數較小,則無需再繼續比較,結束這一回合,也完全不必把數對調。但若數的排列順序都與排序完成的數完全相反,那插入排序的執行時間最糟的情況與氣泡排序及選擇排序一樣是 O(n²)。

堆積排序

遞降次序:Max Heap

Heap Sort
使用堆積排序的執行時間堆積排序最初要將n個數儲存到堆積中的時間是 O(n㏒n)。雖然是一個一個追加數據到空的堆積中,但是堆積的高小於 ㏒₂n,所以每一次追加所需的時間是 O(㏒n)。每回合取出最大值,再重新排列堆積,所需的時間是 O(㏒n)。當回合數是n,堆積重整後接著排序的執行時間也是 O(n㏒n)。堆積排序的整體時間是 O(n㏒n)。到目前為止,跟氣泡排序、選擇排序和插入排序的 O(n²)相比,堆積排序處理速度最快。但因為資料結構相對複雜,建置與維護也變得複雜。

合併排序

將想要排序的數列分割成幾乎等長的兩個數列,直到無法再分割時,再整合各組數列。合併時是將已排序完成的兩個數列整合成一個排序完成的數列。反覆進行同樣的操作,直到全部的數列合併成一個數列。

Merge Sort
使用合併排序的執行時間數的分割不需要耗費時間。要合併兩個排序完成的數列時,只需反覆比較第一個數,將較小的數移動到上層群組,所以執行時間跟兩個數列的長度有關。同一階層裡的合併執行時間,取決於該層的數有多少個。不管哪一層都是n個數,所以每一層的執行時間都是 O(n),n個數在合併成一個群組之前,被對半分割時的層數是 ㏒₂n,所以全部有 ㏒₂n層,整體的執行時間是 O(n㏒n),與堆積排序相同。

快速排序

從數列中隨機選擇一個數做為基準,接著將剩下的數分為「比基準值小的數」和「比基準值大的數」兩個群組,只要排序完這兩個群組裡的數,即可完成整體排序。

Quick Sort

補充:

・快速排序是分治法(Divide and Conquer)的一種。將原問題分成兩個子問題,再分別解決兩個子問題。

・在演算法內部又使用相同演算法的情況,稱為遞迴(Recursion)。

使用快速排序的執行時間為了分解出子問題而選擇基準值時,若每次都選擇會讓兩個子問題大小是原問題一半的基準值,快速排序的執行時間等同於合併排序,為 O(n㏒n)。因為合併排序也是將子問題對半分割的步驟,反覆進行 ㏒₂n次後,讓每個子問題都只有單一元素,來完成排序。

--

--

IgorChien

Genius is one per cent inspiration, ninety-nine per cent perspiration.學無止盡