最快的选择算法的最小kth

时间:2018-05-08 00:58:49

标签: c++ algorithm

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

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;

}

3 个答案:

答案 0 :(得分:2)

int median[(n+4)/5];是一些非标准声明,由某些编译器支持作为扩展。您应该使用std::vector

,而不是使用可变长度数组(VLA)
std::vector median((n+4)/5);

答案 1 :(得分:1)

你不需要制作一个新阵列来控制中位数。只需使用原始数组的五分之一。

这样做的一种方法是stride数组;表示数组作为起始指针,多个元素和一个步幅,它是两个连续元素之间的距离。例如,一旦你完成了将每组五个中位数放在数组中的正确位置[start,n,stride],你就可以在数组上进行递归[start + 2,(n + 2)/ 5,5 *步幅]。

答案 2 :(得分:0)

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

int n = right-left+1;
    int *median = new int[(n+4)/5];