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

隨筆-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>
            葵司免费一区二区三区四区五区| 久久综合色影院| 国产日韩精品久久| 国产精品亚洲综合色区韩国| 国产精品免费视频观看| 国产精品视频自拍| 激情欧美国产欧美| 日韩午夜免费| 香蕉免费一区二区三区在线观看| 久久精品国产成人| 欧美国产亚洲精品久久久8v| 亚洲精品视频啊美女在线直播| 一区二区三区成人精品| 久久精品国产99国产精品澳门| 久久综合伊人77777| 欧美人妖另类| 国产日韩欧美精品| 日韩午夜电影av| 久久精品免费播放| 亚洲精品看片| 亚洲线精品一区二区三区八戒| 久久精品99国产精品日本| 欧美高清一区| 国产片一区二区| 亚洲精品免费在线| 久久超碰97人人做人人爱| 亚洲精品1区2区| 久久精品国产99| 国产精品人成在线观看免费| 亚洲激情专区| 老妇喷水一区二区三区| 99国产一区二区三精品乱码| 久久精品女人的天堂av| 欧美性色aⅴ视频一区日韩精品| 狠狠久久亚洲欧美| 午夜精品婷婷| 日韩西西人体444www| 久久综合色88| 国产亚洲精品v| 午夜精品成人在线视频| 欧美日韩在线视频一区二区| 欧美日韩二区三区| 国产精品久久国产三级国电话系列 | 国产精品黄色| 亚洲精品一区二区三区樱花| 久久男女视频| 亚洲欧美日韩高清| 欧美日韩一视频区二区| 亚洲欧洲精品一区二区三区波多野1战4| 性娇小13――14欧美| 日韩亚洲欧美成人| 欧美劲爆第一页| 亚洲久久一区| 最新成人av网站| 欧美va天堂| 亚洲高清视频的网址| 免费成人在线观看视频| 欧美中文字幕在线播放| 国产偷国产偷亚洲高清97cao| 午夜精品网站| 先锋影音一区二区三区| 国产夜色精品一区二区av| 久久成人综合视频| 欧美一区二区视频观看视频| 国产日本欧美一区二区三区| 欧美一区二区三区啪啪| 午夜精品久久久久久久99樱桃| 国产精品网站在线播放| 久久精品视频在线| 久久久九九九九| 亚洲激情小视频| 亚洲精品久久7777| 欧美日韩亚洲不卡| 销魂美女一区二区三区视频在线| 亚洲自拍16p| 国产啪精品视频| 免播放器亚洲一区| 欧美福利在线| 亚洲视频一起| 欧美伊人久久久久久久久影院| 国产主播一区二区三区| 欧美粗暴jizz性欧美20| 欧美区二区三区| 欧美一区二区私人影院日本| 久久黄色影院| 99re66热这里只有精品3直播| 99re这里只有精品6| 国产伦精品一区二区三区四区免费 | 午夜精品一区二区三区在线播放| 在线观看欧美成人| 国产精品99久久久久久有的能看| 一本大道久久a久久精品综合| 国产精品久久一区二区三区| 久久精品综合| 欧美国产在线观看| 欧美一区免费| 免费成人性网站| 亚洲女人av| 久久天天狠狠| 亚洲一二三级电影| 久久久xxx| 亚洲欧美一区在线| 欧美va天堂| 久久国产免费| 欧美另类在线播放| 麻豆亚洲精品| 国产精品免费视频xxxx| 亚洲国产精品福利| 国产午夜精品视频| 一区二区精品在线观看| 亚洲国产精品高清久久久| 国产精品99久久久久久宅男| 亚洲高清在线观看| 午夜精品亚洲| 亚洲天堂成人| 亚洲午夜一区二区| 免费一级欧美片在线观看| 亚洲专区免费| 欧美国产一区二区三区激情无套| 性色av一区二区三区| 欧美精品日韩| 欧美va亚洲va香蕉在线| 国产精品一区久久| 一区二区三区不卡视频在线观看 | 欧美日韩国产影院| 男人的天堂亚洲在线| 国产伦精品一区二区三区免费迷 | 最新中文字幕亚洲| 亚洲二区视频| 久久九九国产| 久久伊伊香蕉| 国产视频亚洲精品| 亚洲一区www| 亚洲午夜女主播在线直播| 欧美国内亚洲| 亚洲激情第一页| 亚洲区国产区| 欧美成人一区二区三区| 欧美国产精品劲爆| 永久免费视频成人| 久久精品一区蜜桃臀影院 | 亚洲欧洲精品天堂一级| 日韩视频不卡| 欧美激情麻豆| 亚洲毛片在线观看| 中文一区二区| 欧美日韩国产一区二区三区地区 | 亚洲精品久久久久久下一站| 国产一区在线看| 久久精品国产免费| 玖玖国产精品视频| 一区久久精品| 欧美r片在线| 亚洲人成网站色ww在线| 一本色道久久综合亚洲精品高清| 欧美精品午夜| 亚洲婷婷免费| 久久久久成人精品| 亚洲国产欧美精品| 欧美日韩精品免费观看| 亚洲图片欧洲图片日韩av| 欧美一级片在线播放| 国产专区一区| 欧美精品乱人伦久久久久久 | 亚洲欧美在线播放| 久久久噜噜噜久噜久久| 91久久香蕉国产日韩欧美9色| 欧美黄色视屏| 在线一区免费观看| 久久先锋影音av| 日韩一二三区视频| 国产欧美日韩在线| 欧美成人精品在线观看| 亚洲色图制服丝袜| 欧美成人中文字幕| 亚洲欧美日韩一区二区在线 | 99爱精品视频| 久久免费高清视频| 欧美日韩国产91| 欧美一区二区三区日韩| 亚洲国产日韩欧美在线动漫| 午夜精品久久久久99热蜜桃导演| 黄色成人在线| 欧美肉体xxxx裸体137大胆| 久久久www| 亚洲一区二区免费在线| 亚洲电影激情视频网站| 午夜视频一区二区| 日韩一级不卡| 激情综合色丁香一区二区| 国产精品va在线播放我和闺蜜| 久久亚洲私人国产精品va| 亚洲一区在线直播| 91久久精品国产91性色| 久久久久欧美精品| 欧美亚洲色图校园春色| 亚洲理伦在线| 亚洲国产视频一区二区| 国产字幕视频一区二区| 国产精品毛片大码女人|