A 講解:

快速排序法 平均時間複雜度 O(n lg n) 但最糟測資會到 O(n^2) 非為一個stable sort

但總體來說 被公認為最有效率排序演算法

其實C語言函式庫內就有提供 但這裡要做一個實做來了解內部運作

 

基本概念就是 先選一個"鍵值" (程式碼變數splitting) 

比鍵值小者丟到左邊 大者右邊 

接著左右邊各用遞迴不斷的繼續分堆 分成更小的堆

直至只剩下一個元素(故遞迴終止條件設為 left < right)

 

用圖形來解釋如下:

(25) 18 17 66 31 10 28 9 1                       --------------- 第一次選做splitting " () "

[10] 18 17 1 9 (25) [28] 31 66                  --------------- 第二次選做splitting " [] "

{1} 9 [10]  {17} 18 (25) [28] {31} 66     --------------- 第三次選做splitting " {} "

 

你會發現當遞迴停止時(各堆剩下一個) 資料也由小到大排好了

至於如何實做的細節 可以先參考程式碼

有一個 do - while 的迴圈 可說是Qsort的精隨

至於這個迴圈在做什麼事呢? 一樣用圖形講解:

 

其中i = right, j = left + 1

對i來說 只要"遇到比鍵值還小的數"就停止

對j來說 只要"遇到比鍵值還大的數"就停止

然後當兩邊都停止時 就可以交換囉!! 所以 66 和 1 交換 31 和 9 交換

這時 你會發現陣列內存資料會變成這樣:

(25) 18 17 1 9 10 28 31 66

接著我們要把 25 移到中間

所以我們把他和 10 做交換 所以陣列內存資料會變成這樣:

10 18 17 1 9 (25) 28 31 66

如此一來 就分成大小兩堆了

接著左右兩邊做一樣事情就OK了

 

可以試著想想

這筆測資跟 {9, 8, 7, 6, 5, 4, 3, 2, 1}

你一筆比較耗時間呢

可以用追蹤的方式去看看喔

 

B 範例例題如下:

先輸入資料數 即陣列大小

接著輸入一筆未排序測資

請輸出排序後的資料 並在每筆測資後空一行

EX:

Input:

9

25 18 17 66 31 10 28 9 1

Output:

1 9 10 17 18 25 28 31 66

 

C 程式碼如下:

http://codepad.org/zV7DsW9I 

 

 

 

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 codelearner 的頭像
    codelearner

    我的程式學習路~

    codelearner 發表在 痞客邦 留言(0) 人氣()