- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
是否可以使用 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/
QuickSelect 算法是否适用于重复值? 如果我有一个数组 int[] array = {9, 8, 7, 6, 6, 6, 5, 0, 1, 2, 3, 4, 5, 5, 7, 200}; 即
我目前正在实现 Quickselect Algorithm获得列表中最好的 n 个元素。在这种情况下,“最佳”元素是最大的。 我的问题如下: 我发现在有许多重复元素的情况下,这会导致性能不佳,因为最后
维基百科指出快速选择算法 (Link) 的平均运行时间为 O(n)。但是,我无法清楚地理解这是怎么回事。任何人都可以向我解释(通过递归关系 + 主方法的使用)平均运行时间是 O(n) 吗? 最佳答案
我已经实现了快速选择算法。 我有一个问题,当我在数组中使用重复项时,我的算法会陷入无限循环... 你能帮我让它工作吗? 预期复杂度为 O(n),最坏情况为 O(n^2)? #include #inc
我做了快速选择算法,就是找一个数组中第k小的数。我的问题是,它只适用于没有重复的数组。如果我有一个数组 arr = {1,2,2,3,5,5,8,2,4,8,8} 会说第三小的数是2,其实是3。 我不
是否可以使用 Hoare 分区实现 QuickSelect 算法? 至少乍一看似乎无法完成,因为 Hoare 分区不一定返回主元的索引。 我错过了什么吗? 最佳答案 使用 Hoare 分区方案,由于主
我正在学习 QuickSelect 来查找第 K 个最小的数字。我理解了这个程序。但我对 QuickSelect 的平均时间复杂度是 O(n) 感到困惑。 我已经尝试过 Java 代码并且它有效。但我
假设我们有一个数组,我们希望找到它的 K 个最小值: 有两种方法: 1.使用快速选择算法(O(n)时间复杂度和O(1)空间) 2.使用最小堆数据结构(O(NlogK)时间复杂度和O(K)空间) 我想知
如果你不介意的话,我可以帮你做一些功课。基本上,我的想法是对一组值执行快速选择,但是我们得到了一个模板,但我似乎无法弄清楚如何让这些函数与提供的内容一起工作。 问题是这些值不会正确排列,或者如果它们排
我是一名优秀的程序员,十分优秀!