English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類
0

首先我先聲明,這不是學校作業,是我想更了解 qsort 的運用

基本上,bobble sort 是可以很容易理解他的運作方式
就是兩個數比較,而大的往上推

那 qsort 呢? 老實說我無法從他的程式碼來理解他的運作方式
可以解釋他是怎麼運作的嗎?

希望能詳細一點

2006-07-13 09:56:12 · 5 個解答 · 發問者 韋名 2 in 電腦與網際網路 程式設計

5 個解答

qsort全名是Quich Sort,名稱來由是因為他在平常應用上是最快、最方便的一種排序方法。

他的方法就是在陣列中選一個數(假設是a)當作flag,把所有大於a的數字放到a的右邊,小於的就放左邊,再對左右兩邊的陣列(不包括a)進行遞迴,終止條件為陣列長度小於二。

他的優點有幾個:

1)他的時間複雜度"平均"是O(n lg n),但如果對象是已經排序過的陣列,而且每次選取那個旗標的方法不好(像是每次都選最左邊的數)會造成複雜度變成O(n^2),所以一般在實作時會使用隨機的方法,選取旗標時隨機選一個元素而不指定要用陣列開頭,用此方法避免掉worst case的發生

2)在執行函式內容(把數字分兩邊)時不需要額外的記憶體,只需要在排序的對象陣列中做元素的重排,不像merge sort或是heap sort需要另外宣告記憶體來實做

3)qort是一種stable的排序方法,所謂的stable是說當元素的關鍵值(排序依據)相同時,這些元素在函式完成十的排列順序必須和原本一樣。例如下面有個陣列:
a4 b1 c3 d5 e3
按照後面的數字作遞增排序,如果是stable sorting時結果是
b1 c3 e3 a4 d5 (注意其中c3和e3的排列順序)
但如果是unstable的sorting可能結果會變成
b1 e3 c3 a4 d5
至於達成這個特性的方法也很簡單,只要在函式內部把數字分邊時按照陣列原本的順序就可以(也就是說通常寫出來的都是stable的)

基於上面幾點,平常在做排序的時候通常都是用qsort,在C++的standard library裡面的有sort()函式,用的方法就是qsort,C裡面的裡面也有qsort()函式,使用起來非常方便

2006-07-14 21:22:50 補充:
和其他的O(n lg n)的排序方式比較起來,qsort的constant factor小很多

2006-07-14 17:20:29 · answer #1 · answered by YuFan 2 · 0 0

大致上就是先選一個數
把這個數當做中間數
之後把這個陣列的數分成左右兩堆
就是所有比這個數小的丟到左邊
比這個數大的丟到右邊
在左右兩邊遞迴排下去之後
就是排好的陣列了

2006-07-13 12:14:30 · answer #2 · answered by ? 3 · 0 0

課本有啊!
那是內部運算最快的三個方法之一!
而且,雖然同是 O(N log N),但它較適合寫成電腦較短時的指令,所以,其它 O(N log N)快!
缺點:worst case 實在太差!

去找 Algorithm (演算法)的課本,一定有!

2006-08-02 19:20:58 補充:
Merge sort 〝可以〞不用額外的 RAM 喔!
我對 Merge Sort 不是很有興趣,沒啥研究。不過,我做過一題用 Merge Sort 但不可以用額外 RAM 的習題。成功!^_^ 只是不記得那是否是 Merge Sort 的特例了。
但,至少有一例可以,不是嗎?

2006-07-13 11:12:15 · answer #3 · answered by ? 7 · 0 0

謝謝,但我只找得到程式碼,找不到說明

2006-07-13 15:46:06 補充:
sorry,我是高中生

2006-07-13 10:22:26 · answer #4 · answered by 韋名 2 · 0 0

應該是從他運作的方式去寫程式碼吧
網路應該有他的運作方式

2006-07-13 10:21:05 · answer #5 · answered by 3 · 0 0

fedest.com, questions and answers