青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-162  評論-223  文章-30  trackbacks-0
基本原理
   快速排序算法是一種分治排序算法,影響其性能的因素有劃分元素的選擇、小的子文件的處理、重復關鍵字等,本文論述針對重復關鍵字的改進實現。首先來回顧下一般的算法實現,其流程如下:
   a. 選擇一個劃分元素,這個元素在劃分后將在最終的位置上,通常是選擇最右端元素作為劃分點。
   b. 從左端開始掃描,直到找到大于劃分元素的元素;同時從右端開始掃描,直到找到小于劃分元素的元素,再交換使掃描停止的這兩個元素。
   c. 繼續步驟b,直到左指針不小于右指針,最后再交換左指針元素和劃分元素。
   d. 在左指針左側和右側區間(區間不包括左指針元素)重復以上過程,直至元素個數為0或1。
   在劃分的過程中,位于左指針左側的元素都比劃分元素小,右側的元素都比劃分元素大,如下圖所示
   由上述可見,一般的算法實現針對大量重復關鍵字的輸入情況,其性能表現很差,例如如果一個文件完全由相等的值(只有一個值)組成,那么它就不需要再進行任何排序,但前面的算法依然劃分直至得到小的子文件,無論文件有多大。針對這一情況,可以作實質性的改進,從而避免處理元素相同的子區間,提高效率。改進的算法實現主要問題在于如何處理與劃分元素相等的情況,這里的基本思想是將區間劃分為三個部分,左部分小于劃分元素,中間部分等于劃分元素,右部分大于劃分元素,然后再在左右兩部分進行子處理,具體的流程如下:
   a'. 選擇左端元素、中間元素和右端元素的中值作為劃分元素,也就是三者取中劃分,這樣能有效避免劃分區間的最壞情況。
   b'. 從左端開始掃描,直到找到不小于劃分元素的元素;同時從右端開始掃描,直到找到不大于劃分元素的元素,再交換使掃描停止的這兩個元素。如果左指針元素等于劃分元素,那么與左端的元素交換,并遞增左端位置(初始化為文件最左位置);如果右指針元素等于劃分元素,那么與右端元素交換,并遞減右端位置(初始化為文件最右位置)。
   c'. 繼續步驟b',直到左指針不小于右指針。
   d'. 交換最左端區間和左指針左側區間(不包括左指針元素),這一過程會遞減左端位置;交換最右端區間和左指針右側區間(包括左指針元素),這一過程會遞增右端位置。
   e'. 在最左端和最右端區間重復以上過程,直至元素個數為0或1。
   在劃分的過程中,與劃分元素相等的元素分布在最左端和最右端,如下圖所示
   在劃分完成后處理子文件前,需要對調區間,如步驟d'所述,結果如下圖所示

代碼實現
   上面所有圖中的v代表劃分元素,最后列出代碼清單,函數quick_sort有兩個版本,一個是支持operator < 的默認實現,另一個是支持帶謂詞的自定義比較實現。在其中用到了實現三者取中值的__median函數,對應的也有兩個版本實現,如下所示
 1template<class _RandIt>
 2void quick_sort(_RandIt _first,_RandIt _last)
 3{
 4    typedef typename std::iterator_traits<_RandIt>::value_type _ValType;
 5    if (!(_first<_last-1)) return;
 6
 7    _RandIt i = _first,j = _last-1,p = i,q = j,k;
 8    _ValType pivot = __median(*_first,*(_last-1),*(_first+(_last-_first)/2));
 9
10    while(true)
11    {
12        while(*< pivot) ++i;
13        while(pivot < *j) --j;
14        if (!(i < j)) break;
15        std::iter_swap(i,j);
16        
17        if (!(*< pivot) && !(pivot < *i)) 
18            std::iter_swap(p++,i);
19        if (!(*< pivot) && !(pivot < *j))
20            std::iter_swap(q--,j);
21        ++i; --j;
22    }

23    
24    j = i - 1
25    for(k = _first;k<p;--j,++k) std::iter_swap(k,j);
26    for(k = _last-1;k>q;++i,--k) std::iter_swap(k,i);
27
28    quick_sort(_first,j+1);
29    quick_sort(i,_last);
30}

31
32template<class _RandIt,class _Compare>
33void quick_sort(_RandIt _first,_RandIt _last,_Compare _comp)
34{
35    typedef typename std::iterator_traits<_RandIt>::value_type _ValType;
36    if (!(_first < _last - 1)) return;
37
38    _RandIt i = _first,j = _last-1,p = i, q = j, k;
39    _ValType pivot = __median(*_first,*(_last-1),*(_first+(_last-_first)/2),_comp);
40
41    while(true)
42    {
43        while(_comp(*i,pivot)) ++i;
44        while(_comp(pivot,*j)) --j; 
45        if (!(i < j)) break;
46        std::iter_swap(i,j);
47
48        if (!_comp(*i,pivot) && !_comp(pivot,*i)) 
49            std::iter_swap(p++,i);
50        if (!_comp(*j,pivot) && !_comp(pivot,*j))
51            std::iter_swap(q--,j);
52        ++i; --j;
53    }

54    j = i - 1;
55    for(k = _first;k < p;++k,--j)    
56        std::iter_swap(k,j);
57    for(k = _last - 1;k > q;--k,++i) 
58        std::iter_swap(k,i);
59
60    quick_sort(_first,j+1,_comp);
61    quick_sort(i,_last,_comp);
62}
   從上面實現可看出,與一般的實現相比,劃分過程多了兩個if及for循環,if測試用來將找到的重復元素放在左右兩端;for循環用來交換區間,將重復元素再放在中間,這額外的工作量只與找到的重復關鍵字的個數成線性,因此,即使在沒有重復關鍵字的情況下,它也運行得很好,平均時間復雜度為O(NlgN)。
posted on 2012-05-19 14:48 春秋十二月 閱讀(2724) 評論(1)  編輯 收藏 引用 所屬分類: Algorithm

評論:
# re: 三路劃分快速排序--針對重復關鍵字的改進 2015-09-12 19:55 | 御宅暴君
難得遇到用迭代器和模板的 C++ 實現(鼓掌  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产欧美va欧美va香蕉在| 亚洲综合色激情五月| 一区二区三区 在线观看视| 亚洲第一精品电影| 亚洲国产精品尤物yw在线观看| 国外精品视频| 亚洲高清自拍| 亚洲一级黄色av| 亚洲淫片在线视频| 亚洲欧美中文日韩在线| 久久精品日韩欧美| 美女久久一区| 亚洲人精品午夜| 亚洲天堂网站在线观看视频| 午夜在线成人av| 你懂的国产精品永久在线| 欧美激情一区二区三区高清视频 | 99国产精品99久久久久久| 一区二区免费在线播放| 欧美在线看片| 欧美伦理视频网站| 国产亚洲精品aa午夜观看| 亚洲福利国产| 亚洲欧美电影在线观看| 蜜乳av另类精品一区二区| 亚洲精品日韩在线观看| 亚洲天堂男人| 欧美激情一区| 影音先锋久久久| 亚洲一区二区三区四区视频| 久久综合伊人77777蜜臀| 一本久久综合亚洲鲁鲁| 久久亚洲不卡| 国产美女扒开尿口久久久| 亚洲毛片在线看| 久久久蜜桃一区二区人| 一本久道久久综合狠狠爱| 久久久精品性| 国产午夜精品福利| 亚洲视频第一页| 亚洲国产精品精华液2区45| 欧美一区二区三区免费视频| 欧美三级午夜理伦三级中视频| 亚洲国产婷婷香蕉久久久久久99| 久久精品在线免费观看| 亚洲线精品一区二区三区八戒| 欧美激情欧美狂野欧美精品 | 一区二区欧美日韩| 欧美成人精品在线| 欧美在线观看视频一区二区| 国产精品久久久久久久一区探花| 亚洲美女毛片| 亚洲福利免费| 免费久久99精品国产自在现线| 国产在线观看91精品一区| 午夜一区二区三视频在线观看| 亚洲毛片在线观看| 欧美精品首页| 日韩视频中文字幕| 欧美激情日韩| 久久亚洲一区二区三区四区| 亚洲网站在线播放| 亚洲国产欧美在线| 免费亚洲一区| 亚洲伦理在线免费看| 欧美国产综合一区二区| 久久蜜桃精品| 亚洲福利专区| 亚洲第一福利在线观看| 欧美激情在线有限公司| 亚洲久久在线| 亚洲免费大片| 国产精品久久久一本精品| 香港成人在线视频| 欧美在线你懂的| 亚洲第一久久影院| 亚洲福利视频一区| 欧美成人69av| 亚洲性视频h| 午夜精品区一区二区三| 黑人一区二区三区四区五区| 母乳一区在线观看| 男男成人高潮片免费网站| 在线视频精品一区| 亚洲一区二区少妇| 精品1区2区3区4区| 亚洲人成小说网站色在线| 国产精品乱码一区二区三区| 久久精品网址| 欧美精品福利视频| 欧美在线黄色| 欧美福利在线| 欧美一级专区| 免费人成网站在线观看欧美高清| 一区二区三区久久网| 午夜综合激情| 日韩网站在线| 欧美在线综合| 一区二区精品在线观看| 欧美自拍偷拍| 亚洲一级片在线观看| 久久精品国产99国产精品| 夜夜嗨av一区二区三区网页| 午夜精品久久久久影视 | 一区二区三区不卡视频在线观看 | 亚洲欧洲中文日韩久久av乱码| 国产精品夜色7777狼人 | 欧美一区二区高清在线观看| 久久久青草婷婷精品综合日韩| 一区二区三区免费看| 久久久久久成人| 午夜一区二区三区在线观看| 欧美成年网站| 久久亚洲综合| 国产精品美女| 亚洲黑丝一区二区| 亚洲精品一线二线三线无人区| 欧美三级电影一区| 久久久午夜视频| 国产精品久久久久久久浪潮网站 | 夜夜躁日日躁狠狠久久88av| 伊人成人在线| 亚洲欧美日本视频在线观看| 一本一本久久a久久精品综合妖精| 久久九九国产| 久久精品国产精品亚洲精品| 国产精品家庭影院| 亚洲理伦在线| 99视频一区二区| 欧美aⅴ一区二区三区视频| 久久亚洲精品伦理| 国产午夜精品全部视频播放 | 中文无字幕一区二区三区| 亚洲精品久久嫩草网站秘色| 久久久久久久久久久久久女国产乱 | 国产精品视频成人| 一区二区三区免费网站| 一区二区激情视频| 欧美另类变人与禽xxxxx| 亚洲激情综合| 一区二区三区四区国产| 欧美日韩精品久久| 亚洲精品资源美女情侣酒店| 亚洲精选在线观看| 欧美日韩国产精品成人| 亚洲人成久久| 亚洲尤物影院| 国产精品亚洲激情| 欧美一级久久| 男同欧美伦乱| 亚洲国产婷婷| 欧美日韩亚洲激情| 亚洲色图自拍| 久久黄色级2电影| 国产日韩欧美在线播放| 欧美中文在线观看国产| 欧美成人精品h版在线观看| 亚洲美女黄色片| 欧美午夜片在线观看| 欧美一区二区三区在线播放| 欧美大片免费| 亚洲天堂网在线观看| 国产亚洲成av人片在线观看桃| 久久久久亚洲综合| 亚洲精品乱码久久久久久蜜桃91| 亚洲欧美怡红院| 一区免费在线| 欧美日韩视频在线一区二区| 亚洲欧美另类中文字幕| 欧美高清视频一二三区| 亚洲在线观看免费视频| 狠狠色丁香婷婷综合影院| 欧美日韩麻豆| 欧美在线视频一区二区三区| 亚洲黄一区二区三区| 欧美影院一区| 亚洲理论在线| 99精品99| 久久精品国产清高在天天线| 欧美老女人xx| 欧美一区二区视频在线观看2020| 久久久久久尹人网香蕉| 亚洲美洲欧洲综合国产一区| 欧美在线免费视屏| 99热在线精品观看| 国产自产v一区二区三区c| 欧美精品1区2区| 久久国产精品久久久| 9人人澡人人爽人人精品| 久久国产99| 亚洲午夜免费福利视频| 亚洲国产裸拍裸体视频在线观看乱了中文 | 久久久999国产| 一区二区欧美在线观看| 91久久精品视频| 国产日韩欧美在线播放不卡| 欧美日韩午夜在线| 嫩草伊人久久精品少妇av杨幂| 午夜精品一区二区三区在线视| 99re66热这里只有精品4|