• <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>

            Zero Lee的專欄

            selection algorithm to select nth small elements based on partition

            http://en.wikipedia.org/wiki/Selection_algorithm
            1. partition algorithm
             1  function partition(list, left, right, pivotIndex)
             2      pivotValue := list[pivotIndex]
             3      swap list[pivotIndex] and list[right]  // Move pivot to end
             4      storeIndex := left
             5      for i from left to right-1
             6          if list[i] < pivotValue
             7              swap list[storeIndex] and list[i]
             8              storeIndex := storeIndex + 1
             9      swap list[right] and list[storeIndex]  // Move pivot to its final place
            10      return storeIndex

            2. selection algorithm
             1 function select(list, left, right, k)
             2      loop
             3          select pivotIndex between left and right
             4          pivotNewIndex := partition(list, left, right, pivotIndex)
             5          if k = pivotNewIndex - left + 1
             6              return list[pivotNewIndex]
             7          else if k < pivotNewIndex left + 1
             8              right := pivotNewIndex-1
             9          else
            10              left := pivotNewIndex+1
            11              k := k pivotNewIndex    

            >> In above last statement, one bug. Should be
               k := k-pivotNewIndex-left+1
               left := pivotNewIndex+1

            3. code
             1 int partition(std::vector<int>& a, int l, int r)
             2 {
             3     int i = l, j = l;
             4     int p = a[r];
             5     while (j<r) {
             6         if (a[j] < p) {
             7             std::swap(a[i], a[j]);
             8             i++;
             9         }
            10         j++;
            11     }
            12     std::swap(a[r], a[i]);
            13     return i;
            14 }
            15 
            16 void select_kth_smallest(std::vector<int>& a, int l, int r, int k)
            17 {
            18     while (1) {
            19         int cut = partition(a, l, r);
            20 #if 0
            21         std::copy(a.begin()+l, a.begin()+cut, std::ostream_iterator<int>(std::cout, " "));
            22         std::cout << " <=" << a[cut] << "=> ";
            23         std::copy(a.begin()+cut+1, a.begin()+r+1, std::ostream_iterator<int>(std::cout, " "));
            24         std::cout << "cut("<<cut<<"),k("<<k<<"),l("<<l<<"),r("<<r<<")\n";
            25 #endif
            26         if (cut-l+1==k)
            27             break;
            28         else if (k < cut-l+1)
            29             r = cut-1;
            30         else {
            31             k = k-cut-1+l;
            32             l = cut+1;
            33         }
            34     }
            35 }
            36 

            posted on 2011-03-17 20:20 Zero Lee 閱讀(277) 評論(0)  編輯 收藏 引用 所屬分類: Data structure and algorithms

            伊人伊成久久人综合网777| 人妻无码精品久久亚瑟影视| 亚洲精品美女久久久久99| 中文字幕日本人妻久久久免费| 久久久久久精品久久久久| aaa级精品久久久国产片| 一本久道久久综合狠狠躁AV| 91精品国产乱码久久久久久 | 99国内精品久久久久久久| 99久久99久久精品国产片| 青春久久| 久久国产色AV免费观看| 狠狠精品干练久久久无码中文字幕| 久久se精品一区精品二区国产| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 精品久久久久久无码中文字幕一区 | 精品国产乱码久久久久软件| 亚洲va久久久噜噜噜久久男同 | 久久亚洲私人国产精品| 国产精品成人无码久久久久久| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久精品国产只有精品2020| 久久久久99精品成人片三人毛片 | 久久精品国产99国产精品| 欧美亚洲国产精品久久| 亚洲精品无码久久不卡| 国产日产久久高清欧美一区| 亚洲人AV永久一区二区三区久久| 久久精品国产亚洲av高清漫画| 国产成人精品久久综合| 亚洲AV日韩AV永久无码久久| 狠狠综合久久综合中文88 | 久久亚洲AV无码精品色午夜麻豆| 久久精品国产第一区二区三区 | 激情伊人五月天久久综合| 久久综合精品国产一区二区三区| 久久综合丝袜日本网| 婷婷久久综合九色综合98| 91久久成人免费| 久久精品国产精品亚洲艾草网美妙| 久久精品国产精品亜洲毛片|