(一)目標
在實際問題的解決過程中,我們發現,很多問題都可以歸結為對資料的排序和查詢。而查詢的效率則在很大程度上依賴於排序的效率;尤其是在資料量達到海量級的時候。因此,設計乙個有效的排序演算法是至關重要的。本文設計了乙個通用的c++ quicksort 模板類。通過簡單的提供乙個data類,可以實現任意資料的快速排序演算法,提高了開發效率。
(二)快速排序演算法的思想
最基本的快速排序的思想是基於分治策略的:
對於輸入的子串行l[p..r],如果規模足夠小則直接進行排序,否則分三步處理:
1 分解(divide):將輸入的序列l[p..r]劃分成兩個非空子序列l[p..q]和l[q+1..r], 使l[p..q]中任一元素的值不大於l[q+1..r]中任一元素的值。
2 遞迴求解(conquer):通過遞迴呼叫快速排序演算法分別對l[p..q]和l[q+1..r]進行排序。
3 合併(merge):由於對分解出的兩個子串行的排序是就地進行的, 所以在l[p..q]和l[q+1..r]都排好序後不需要執行任何計算l[p..r]就已排好序。
(三)準備工作和源**
1 使用vc6建立console工程
2 加入下面的模板類:
template//datatype是模板引數,代表了欲排序的資料型別
class quicksorttemp
~quicksorttemp()
public:
// 快速排序的實現,array是要排序資料的陣列,nlower,nupper範圍是0 ~ 資料總個數-1
static void quicksort(datatype* array, int nlower, int nupper)
}// 切分資料為左右兩個部分,返回中間元素x的編號
// 主要的過程就是:選擇乙個元素x作為分界點,將比x大的元素放到x右邊,其餘放到x左邊。
static int partition (datatype* array, int nlower, int nupper)
}swap = array[nlower];
array[nlower] = array[nright];
array[nright] = swap;
return nright;}};
以上就實現了快速排序的模板類。
3 資料類介面的實現
從上面模板類的實現我們可以看出,為了使用這個模板類對某種型別的資料陣列datatype * data進行排序,我們必須實現datatype的介面compareto(比較兩個datatype 元素a,b的大小,a>b返回1,a==b返回0,否則返回-1)。
舉個例子來說:現在要排序二維點座標,定義大小關係是:先比較x軸座標值大小,x相同的話,由y值大小決定大小關係。即:(1,1) == (1,1) , (2,1) > (1, 10) , (3, 5) < (4, 1)。
此外:還必須實現datatype型別的無引數的預設建構函式(因為模板類中要使用)。
定義資料型別mypoint如下:
struct mypoint
mypoint(int x, int y)
int compareto(mypoint& b)
}int x;
int y;
};(四)測試
下面是用於測試的主函式:
int _tmain(int argc, tchar* argv, tchar* envp)
;int count = 10;
//排序前
printf("before quicksort:/n");
for(int i = 0 ; i (%d,%d)/n", i, points[i].x, points[i].y);
//呼叫模板類排序
quicksorttemp::quicksort(points, 0, count - 1);
//排序後
printf("after quicksort:/n");
for(i = 0 ; i (%d,%d)/n", i, points[i].x, points[i].y);
system("pause");
return nretcode;
}結果輸出如下:
before quicksort:
0 <-------> (1,1)
1 <-------> (2,5)
2 <-------> (7,11)
3 <-------> (100,2)
4 <-------> (1,7)
5 <-------> (9,32)
6 <-------> (7,1)
7 <-------> (2,2)
8 <-------> (1,1)
9 <-------> (9,5)
after quicksort:
0 <-------> (1,1)
1 <-------> (1,1)
2 <-------> (1,7)
3 <-------> (2,2)
4 <-------> (2,5)
5 <-------> (7,1)
6 <-------> (7,11)
7 <-------> (9,5)
8 <-------> (9,32)
9 <-------> (100,2)
請按任意鍵繼續 . . .
(五)說明
本文根據快速排序演算法,實現了乙個c++快速排序模板類。使用這個模板類,並遵守欲排序資料型別必須實現的介面定義,就能實現對任意資料型別的快速排序。當然,本文的例子只是乙個基本的引導。
排序 C 快速排序模板
無注釋的 include using namespace std const int n 100005 int a n void quicksort int q,int l,int r int index q l r 1 int i l 1,j r 1 while i j while q i ind...
C 快速排序模板
void quick sort int q,int l,int r while i quick sort q,l,j 剩下左邊再排一次 quick sort q,j 1,r 右邊再拍排一次 給定你乙個長度為n的整數數列。請你使用快速排序對這個數列按照從小到大進行排序。並將排好序的數列按順序輸出。輸入...
簡單實用的c 快速排序模板類
在實際問題的解決過程中,我們發現,很多問題都可以歸結為對資料的排序和查詢。而查詢的效率則在很大程度上依賴於排序的效率 尤其是在資料量達到海量級的時候。因此,設計乙個有效的排序演算法是至關重要的。一 目標 在實際問題的解決過程中,我們發現,很多問題都可以歸結為對資料的排序和查詢。而查詢的效率則在很大程...