簡單實用的c 快速排序模板類

2021-04-13 09:58:09 字數 2907 閱讀 5676

在實際問題的解決過程中,我們發現,很多問題都可以歸結為對資料的排序和查詢。而查詢的效率則在很大程度上依賴於排序的效率;尤其是在資料量達到海量級的時候。因此,設計乙個有效的排序演算法是至關重要的。

(一)目標

在實際問題的解決過程中,我們發現,很多問題都可以歸結為對資料的排序和查詢。而查詢的效率則在很大程度上依賴於排序的效率;尤其是在資料量達到海量級的時候。因此,設計乙個有效的排序演算法是至關重要的。本文設計了乙個通用的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 快速排序模板類

在實際問題的解決過程中,我們發現,很多問題都可以歸結為對資料的排序和查詢。而查詢的效率則在很大程度上依賴於排序的效率 尤其是在資料量達到海量級的時候。因此,設計乙個有效的排序演算法是至關重要的。一 目標 在實際問題的解決過程中,我們發現,很多問題都可以歸結為對資料的排序和查詢。而查詢的效率則在很大程...

c 快速排序模板類

一 目標 在實際問題的解決過程中,我們發現,很多問題都可以歸結為對資料的排序和查詢。而查詢的效率則在很大程度上依賴於排序的效率 尤其是在資料量達到海量級的時候。因此,設計乙個有效的排序演算法是至關重要的。本文設計了乙個通用的c quicksort 模板類。通過簡單的提供乙個data類,可以實現任意資...

排序 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...