3路随机快速排序分区功能
3-way random quicksort partition function
我正在尝试实现 3 向随机快速排序算法,我正在努力弄清楚"分区函数应该是什么样子"。有人可以帮我实施吗?到目前为止我写的代码:
void randomized_quick_sort(vector<int> &a, int l, int r, int pivot) {
if (l >= r) {
return;
}
int k = l + rand() % (r - l + 1); // Pivot - random number between l and r
swap(a[l], a[k]); // Swap leftmost element and pivot element
int m1 = l;
int m2 = r;
partition3(a,l,r,m1,m2,k)
randomized_quick_sort(a, l, m1 - 1);
randomized_quick_sort(a, m2 + 1, r);
}
我需要弄清楚partition3()
功能。
即使你在弄清楚问题或答案方面没有表现出太多工作,这里的答案就是我的答案。该函数的主要思想是将部分分为 3 种方式(顾名思义(,以便像4 9 4 4 1 9 4 4 9 4 4 1 4
这样的数组,如果 4 将用作枢轴元素,它将分为三个部分;1 1
作为第一部分,4 4 4 4 4 4 4 4
作为中间部分,9 9 9
作为第三部分,因此我们不会将额外的 4 进一步递归。下面是它的简单实现。在这里,我用另一个数组返回分割数组的相应位置。您可以通过将这些位置作为引用给出的参数提供给函数来轻松做到这一点。
vector<int> partition3(vector<int> &a, int beg, int end){
int x = a[beg];
vector<int> ex(2);
for(int i=beg; i<=end;){
if(a[i]<x){
swap(a[beg],a[i]);
beg++;i++;
}else if(a[i]==x){
i++;
}else{
swap(a[i],a[end]);
end--;
}
ex[0]=beg;ex[1]=end;
}
return ex;
}
如果您想进一步阅读,GeeksforGeeks网站上有一个关于它的主题,其中包含另一个示例和更多解释。但首先尝试理解答案,而不是直接复制任何其他答案。这是一个相当简单的方法。祝你好运!
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 对可变参数使用声明.如何选择正确的功能
- 询问在设计我的手臂模拟器功能表示格式1
- 3路随机快速排序分区功能