針對待排序列中農存在大量重複鍵值的情況,上一節講了一種對快排演算法的優化,**如下:
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標記中所含的文字...