2008年11月20日 星期四

QuickSort using C++

QuickSort:一種遞迴技術的排序

(a) 分割步驟:選取未經過排序陣列的第一個元素,並決定它經過排序之後的陣列中的最後位置。

假設此陣列未經排序的第一個元素為21
21 32 5 67 0 12 4 23 53 14

經過排序後,我們找到21在陣列中的最後位置。
12 4 5 14 0 21 67 53 32 23

換句話說,以21為基準,其左邊的所有元素值皆小於它,右邊的所有元素值皆大於它。

我們因此可以將此陣列分成兩個子陣列。
子陣列I:12, 4, 5, 14, 0 (左邊 五個元素)
子陣列II: 67, 53, 32, 23 (右邊 四個元素)

(b) 遞回步驟:對每個位排序的子陣列,執行步驟(a)

(b1)每次對子陣列執行步驟(a)時,必會找到一個元素放在排序過陣列的最後位置上。{同上述(a)之解釋 keypoint: 把21 32 5 67 0 12 4 23 53 14 視為一個子陣列}

(b2)當子陣列由一個元素所組成時,則此唯一個元素必是已經排序過的,因此,這個元素已位在它最後的位置上。

我們如何決定每個子陣列第一個元素的最終位置呢?
EX:
37 2 6 4 89 8 10 12 68 45

(A)從陣列最右邊的元素開始,將每個元素與37比較,直到找出某個小於37的元素。然後將37和這個元素作交換。第一個比37小的元素是12,因此,37會和12交換。
12 2 6 4 89 8 10 37 68 45

(B)從陣列最左邊開始,但是在元素12之後,將每個元素與37比較,直到找到比37大的元素為止。

參考資料: C++程式設計藝術 第四版 DEITEL&DEITEL, Pearson