針對重複鍵值的3路快速排序演算法

2021-08-08 02:02:33 字數 2522 閱讀 5130

針對待排序列中農存在大量重複鍵值的情況,上一節講了一種對快排演算法的優化,**如下:

templateint __patition(t arr, int l, int r)

while(j >= l + 1 && arr[j] > v)

if(i > j)

swap(arr[i++],arr[j--]);

}swap(arr[j], arr[l]);

return j;

}templatevoid __quicksort(t arr, int l, int r)

else

}templatevoid quicksort(t arr, int n)

實際上還存在一種針對重複鍵值的經典優化快排演算法,稱為3路快速排序演算法,這種排序演算法相比上一節的優化效率更高,3路快排將待排序列分為3部分:v,則進行遞迴時,對==v的部分就不用考慮,只需考慮對

若 i 指向的元素

最後將arr[l]和arr[lt交換]。

接下來遞迴只針對

3路快速排序演算法的c++實現如下,我們將之前講的2種快排和3路快排進行時間效能上的比較:

sorttesthelper.h檔案(包含輔助函式)

#include #include #include //clock()、clocks_per_sec

#include //包含函式assert()

using namespace std;

namespace sorttesthelper

return arr;

}//輔助函式 - 產生乙個近乎有序的隨機數組

int* generatenearlyorderedarray(int n, int swaptime)

//然後交換幾組元素,使之變成無序但近乎有序的陣列

srand(time(0));

for(int j = 0; j < swaptime; j++)

return arr;

}//輔助陣列 - 產生乙個完全有序陣列

int* generatetotallyorderedarray(int n)

return arr;

}//輔助函式 - 列印陣列

templatevoid printarray(t arr, int n)

cout << endl;

}//輔助函式 - 判斷陣列是否有序(公升序)

templatebool issorted(t arr, int n)

}return true;

}//輔助函式 - 測試演算法的時間

templatevoid testsort(string sortname, void(*sort)(t, int), t arr, int n) //arr和n是函式指標需要的引數

//輔助函式 - 拷貝陣列

int* copyintarray(int a, int n)

}

main.cpp檔案(包含3中快排演算法)

#include #include #include #include "sorttesthelper.h"

using namespace std;

//對arr[l...r]進行插入排序

templatevoid insertionsort(t arr, int l, int r)

arr[j] = e;

}}//3路快速排序

templatevoid __quicksort3ways(t arr, int l, int r)

else

//快排2

templateint __patition2(t arr, int l, int r)

while(j >= l + 1 && arr[j] > v)

if(i > j)

swap(arr[i++],arr[j--]);

}swap(arr[j], arr[l]);

return j;

}templatevoid __quicksort2(t arr, int l, int r)

else

}templatevoid quicksort2(t arr, int n)

//快排

templateint __patition(t arr, int l, int r)

}swap(arr[l], arr[j]);

return j;

}templatevoid __quicksort(t arr, int l, int r) //對arr[l...r]進行快速排序

else

}templatevoid quicksort(t arr, int n)

int main()

測試結果如下:

可以看出,對於隨機待排序列和近乎有序序列,3種快排演算法的時間效能差不多,而且都符合理想效能;在含有大量重複鍵值的序列中,3路快速排序演算法的時間效能會更好。

可以根據實際情況選取三種快排演算法中的一種進行應用。

快排演算法的針對重複鍵值的優化

上一節講了快排演算法在序列基本有序的情況下的兩種優化方法,這一節我們對新的測試用例進行測試,測試用例如下所示 int main 測試結果如下 可見,對於資料量很大,並且重複資料很多的情況,即使是上一節優化過的快排演算法,其時間效能也是不能接受的,這裡針對這種重複資料量大的情況對快排演算法作出進一步優...

python字典多鍵值及重複鍵值的使用方法 詳解

在python中使用字典,格式如下 dict 在實際訪問字典值時的使用格式如下 dict key 多鍵值字典的多鍵值形式如下 dict 在實際訪問字典裡的值時的具體形式如程式設計客棧下所示 以第乙個鍵為例 dict key11,key12 或者是 dict key11,key12 以下是實際例子 多...

GG和百度對重複標題的態度

某天登入谷歌管理員工具後台,發現部落格的html建議 現了以下兩個提示 1,重複的元說明 元說明資訊能讓使用者清楚地了解您 的內容,而且還會鼓勵使用者在搜尋結果頁面中點選您的 2,重複的標題標記 您的所有權為使用者和搜尋引擎提供了有關您 的有用資訊。所有權www.cppcns.com標記中所含的文字...