gpt4 book ai didi

algorithm - 带有 Hoare 分区方案的 QuickSelect

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:05:42 26 4
gpt4 key购买 nike

是否可以使用 Hoare 分区实现 QuickSelect 算法?

至少乍一看似乎无法完成,因为 Hoare 分区不一定返回主元的索引。

我错过了什么吗?

最佳答案

使用 Hoare 分区方案,由于主元或等于主元的元素可以在分区步骤后的任何位置结束,因此当分区大小减小为单个元素时,会出现基本(终止)情况。示例代码。 QuickSelectr 是实际功能。 QuickSelect 验证参数。

int QuickSelectr(int a[], int lo, int hi, int k )
{
if (lo == hi) // recurse until lo == hi
return a[lo];
int p = a[(lo+hi)/2]; // Hoare partition
int i = lo - 1;
int j = hi + 1;
while (1){
while (a[++i] < p);
while (a[--j] > p);
if (i >= j)
break;
std::swap(a[i], a[j]);
}
if(k <= j)
return QuickSelectr(a, lo, j-0, k); // include a[j]
else
return QuickSelectr(a, j+1, hi, k); // exclude a[j]
}

// parameter check
int QuickSelect(int *a, int lo, int hi, int k)
{
if(a == (int *)0 || k < lo || k > hi || lo > hi)
return 0;
return QuickSelectr(a, lo, hi, k);
}

使用 i 而不是 j 进行拆分:

int QuickSelectr(int a[], int lo, int hi, int k )
{
if (lo == hi) // recurse until lo == hi
return a[lo];
int p = a[(lo+hi+1)/2]; // Carefully note the +1 compared
// to the variant where we use j
int i = lo - 1;
int j = hi + 1;
while (1){
while (a[++i] < p);
while (a[--j] > p);
if (i >= j)
break;
std::swap(a[i], a[j]);
}
if(k < i)
return QuickSelectr(a, lo, i-1, k); // exclude a[i]
else
return QuickSelectr(a, i+0, hi, k); // include a[i]
}

关于algorithm - 带有 Hoare 分区方案的 QuickSelect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58331986/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com