3路随机快速排序分区功能

3-way random quicksort partition function

本文关键字:功能 分区 快速排序 随机 3路      更新时间:2023-10-16

我正在尝试实现 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网站上有一个关于它的主题,其中包含另一个示例和更多解释。但首先尝试理解答案,而不是直接复制任何其他答案。这是一个相当简单的方法。祝你好运!