美文网首页
three way partition

three way partition

作者: devilisdevil | 来源:发表于2020-08-23 16:51 被阅读0次

问题描述

partition算法就是将我们的一个数组中的数分成高低两部分,返回分割点的位置。
而三路划分将数组中的数分成三个部分,大于/小于/等于某个值,分割点有两个。这样处理往往能提升我们的效率(可以尽快地减少我们需要寻找的范围)

three way partition是一种划分思想,我们需要的通常是那两个划分点,具体怎么使用这两个划分点请依照你的实际需要。

直接看代码

两种风格,一是从一头扫描,另一种从两头扫描,两头扫描更优。

int three_way_partition(vector<int> &L, int l, int r, int target) {
  // after partition, it's like:
  // ---[=]=[=]+++
  //    low high
  int i = l, low = l, high = r;
  while (i <= high) {
    if (L[i] == target)
      ++i;
    else if (L[i] < target)
      swap(L[i++], L[low++]);
    else
      swap(L[i], L[high--]);
  }
  // do something with low, high...
}

示例代码

可以参考median of medians中使用的three way partition。

BFPRT.cpp中的三路划分是从一头扫描。(直接从wiki源代码翻译过来),BFPRT-simple.cpp中的使用的是两头扫描版本。

参考

相关文章

网友评论

      本文标题:three way partition

      本文链接:https://www.haomeiwen.com/subject/hfwqjktx.html