轉載自 這裡 (Gossip@Caterpillar)
前言 :
之前說過軸的選擇是快速排序法的效率關鍵之一,在這邊的快速排序法的軸選擇方式更加快了快速排序法的效率,它是來自演算法名書 Introduction to Algorithms 之中.
解法 :
先說明這個快速排序法的概念,它以最右邊(或最左邊)的值s作比較的標準,將整個數列分為三個部份,一個是小於s的部份,一個是大於s的部份,一個是未處理的部份,如下所示 :
在排序的過程中,i 與 j 都會不斷的往右進行比較與交換,最後數列會變為以下的狀態:
然後將s的值置於中間,接下來就以相同的步驟會左右兩邊的數列進行排序的動作,如下所示:
整個演算的過程,直接摘錄書中的虛擬碼來作說明:
一個實際例子的演算如下所示:
演算法範例代碼 :
* SortQuick3.h 代碼 :
* SortQuick3.cpp 代碼 :
* 呼叫演算法代碼 :
執行結果 :
前言 :
之前說過軸的選擇是快速排序法的效率關鍵之一,在這邊的快速排序法的軸選擇方式更加快了快速排序法的效率,它是來自演算法名書 Introduction to Algorithms 之中.
解法 :
先說明這個快速排序法的概念,它以最右邊(或最左邊)的值s作比較的標準,將整個數列分為三個部份,一個是小於s的部份,一個是大於s的部份,一個是未處理的部份,如下所示 :
在排序的過程中,i 與 j 都會不斷的往右進行比較與交換,最後數列會變為以下的狀態:
然後將s的值置於中間,接下來就以相同的步驟會左右兩邊的數列進行排序的動作,如下所示:
整個演算的過程,直接摘錄書中的虛擬碼來作說明:
- QUICKSORT(A, p, r)
- if p < r
- then q <- PARTITION(A, p, r)
- QUICKSORT(A, p, q-1)
- QUICKSORT(A, q+1, r)
- end QUICKSORT
- PARTITION(A, p, r)
- x <- A[r]
- i <- p-1
- for j <- p to r-1
- do if A[j] <= x
- then i <- i+1
- exchange A[i]<->A[j]
- exchange A[i+1]<->A[r]
- return i+1
- end PARTITION
一個實際例子的演算如下所示:
演算法範例代碼 :
* SortQuick3.h 代碼 :
- #include "main.h"
- #include "Basic.h"
- #define MAX_SORT_QUICK3_LEN 11
- /*
- * Source : http://caterpillar.onlyfun.net/Gossip/AlgorithmGossip/QuickSort3.htm
- */
- void quickSort3(int num[], int len);
- void _quickSort3(int num[], int left, int right, int len);
- int _partition(int num[], int left, int right, int len);
- #include "SortQuick3.h"
- void quickSort3(int num[], int len) {
- _quickSort3(num, 0, len-1, len);
- }
- void _quickSort3(int num[], int left, int right, int len){
- if(left < right) {
- int q = _partition(num, left, right, len);
- _quickSort3(num, left, q-1, len);
- _quickSort3(num, q+1, right, len);
- }
- }
- int _partition(int num[], int left, int right, int len){
- int i = left -1;
- for(int j=left ; j
- if(num[j] < num[right]) {
- i++;
- SWAP(num[i], num[j]);
- }
- }
- SWAP(num[i+1],num[right]);
- return i+1;
- }
- void sortQuick3(bool b) {
- if(b) {
- int num[MAX_SORT_QUICK3_LEN];
- getRandomArray(num, MAX_SORT_QUICK3_LEN);
- cout << "Original Array: " << endl;
- printArray(num, MAX_SORT_QUICK3_LEN);
- quickSort3(num, MAX_SORT_QUICK3_LEN);
- cout << "After Quick3 Sorting: " << endl;
- printArray(num, MAX_SORT_QUICK3_LEN);
- }
- }
執行結果 :
This message was edited 5 times. Last update was at 06/08/2010 18:15:46
沒有留言:
張貼留言