演算法一:高速排序演算法
高速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要Ο(n log n)次比較。在最壞狀況下則須要Ο(n2) 次比較,但這樣的狀況並不常見。其實,高速排序通常明顯比其它Ο(n log n) 演算法更快,由於它的內部迴圈(inner loop)能夠在大部分的架構上很有效率地被實現出來。
高速排序使用分治法(Divide and conquer)策略來把一個序列(list)分為兩個子序列(sub-lists)。
演算法步驟:
1 從數列中挑出一個元素,稱為 “基準”(pivot)。
2 又一次排序數列,全部元素比基準值小的擺放在基準前面。全部元素比基準值大的擺在基準的後面(相同的數能夠到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。
這個稱為分割槽(partition)操作。
3 遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,可是這個演算法總會退出。由於在每次的迭代(iteration)中。它至少會把一個元素擺到它最後的位置去。
演算法二:堆排序演算法
堆排序(Heapsort)是指利用堆這樣的資料結構所設計的一種排序演算法。
堆積是一個近似全然二叉樹的結構,並同一時候滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。
堆排序的平均時間複雜度為Ο(nlogn) 。
1. 建立一個堆H[0..n-1]
2. 把堆首(最大值)和堆尾互換
3. 把堆的尺寸縮小1,並呼叫 shift_down (0),目的是把新的陣列頂端資料調整到相應位置
4. 反覆步驟2。直到堆的尺寸為1
演算法三:歸併排序
歸併排序(Merge sort。臺灣譯作:合併排序)是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個很典型的應用。
1. 申請空間,使其大小為兩個已經排序序列之和。該空間用來存放合併後的序列
2. 設定兩個指標,最初位置分別為兩個已經排序序列的起始位置
3. 比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間。並移動指標到下一位置
4. 反覆步驟 3 直到某一指標達到序列尾
5. 將還有一序列剩下的全部元素直接複製到合併序列尾
演算法一:高速排序演算法
高速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要Ο(n log n)次比較。在最壞狀況下則須要Ο(n2) 次比較,但這樣的狀況並不常見。其實,高速排序通常明顯比其它Ο(n log n) 演算法更快,由於它的內部迴圈(inner loop)能夠在大部分的架構上很有效率地被實現出來。
高速排序使用分治法(Divide and conquer)策略來把一個序列(list)分為兩個子序列(sub-lists)。
演算法步驟:
1 從數列中挑出一個元素,稱為 “基準”(pivot)。
2 又一次排序數列,全部元素比基準值小的擺放在基準前面。全部元素比基準值大的擺在基準的後面(相同的數能夠到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。
這個稱為分割槽(partition)操作。
3 遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,可是這個演算法總會退出。由於在每次的迭代(iteration)中。它至少會把一個元素擺到它最後的位置去。
演算法二:堆排序演算法
堆排序(Heapsort)是指利用堆這樣的資料結構所設計的一種排序演算法。
堆積是一個近似全然二叉樹的結構,並同一時候滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。
堆排序的平均時間複雜度為Ο(nlogn) 。
演算法步驟:
1. 建立一個堆H[0..n-1]
2. 把堆首(最大值)和堆尾互換
3. 把堆的尺寸縮小1,並呼叫 shift_down (0),目的是把新的陣列頂端資料調整到相應位置
4. 反覆步驟2。直到堆的尺寸為1
演算法三:歸併排序
歸併排序(Merge sort。臺灣譯作:合併排序)是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個很典型的應用。
演算法步驟:
1. 申請空間,使其大小為兩個已經排序序列之和。該空間用來存放合併後的序列
2. 設定兩個指標,最初位置分別為兩個已經排序序列的起始位置
3. 比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間。並移動指標到下一位置
4. 反覆步驟 3 直到某一指標達到序列尾
5. 將還有一序列剩下的全部元素直接複製到合併序列尾