首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速选择算法的最小kth

快速选择算法的最小kth
EN

Stack Overflow用户
提问于 2018-05-08 08:58:49
回答 3查看 117关注 0票数 1

我一直在开发一个程序,该程序旨在测试快速选择算法在不同组大小设置下的性能。找到中心,算法会将所有元素分成5个一组。它应该找到每组的中位数,并使用所有组的中位数的中位数作为轴心。我对最小的第k部分有个问题。我得到的错误是,n不是一个常量变量,所以它不能分配数组,并且它导致median的大小未知。我应该怎么做才能纠正这个问题呢?

代码语言:javascript
复制
int smallestKth(int ray[], int l, int r, int k)

 {
if (k > 0 && k <= r - l + 1)

{

    int n = r-l+1; 
    int i, median[(n+4)/5]; 
    for (i=0; i<n/5; i++)
        median[i] = medianFind(ray+l+i*5, 5);
    if (i*5 < n) 

    {
        median[i] = medianFind(ray+l+i*5, n%5);
        i++;
    }   


    int medOfMed = (i == 1)? median[i-1]:
        smallestKth(median, 0, i-1, i/2);


    int pivotPosition = part(ray, l, r, medOfMed);
    if (pivotPosition-l == k-1)
        return ray[pivotPosition];

    if (pivotPosition-l > k-1) 
        return smallestKth(ray, l, pivotPosition-1, k);      
    return smallestKth(ray, pivotPosition+1, r, k-pivotPosition+l-1);

}
return INT_MAX;

}
EN

回答 3

Stack Overflow用户

发布于 2018-05-08 09:16:47

int median[(n+4)/5];是一些编译器作为扩展支持的非标准声明。应该使用std::vector,而不是使用可变长度数组(VLA)。

代码语言:javascript
复制
std::vector median((n+4)/5);
票数 2
EN

Stack Overflow用户

发布于 2018-05-08 13:46:36

你不需要创建一个新的数组来保存中值。只需使用原始数组的五分之一。

要做到这一点,一种方法是stride数组;将数组表示为起始指针、元素数和步长,步长是两个连续元素之间的距离。例如,一旦你在数组start,n,stride中正确的位置放置了每组5的中位数,你就可以在数组start+2,(n+2)/5,5*stride上递归。

票数 1
EN

Stack Overflow用户

发布于 2018-05-08 11:00:23

这是通过为中间数组创建指针来解决的。

代码语言:javascript
复制
int n = right-left+1;
    int *median = new int[(n+4)/5];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50224357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档