Kth在2个未排序数组中排名

时间:2016-04-06 10:24:53

标签: c arrays algorithm data-structures

让我们假设我们有两个数组A []和B []。每个数组包含n个不同的整数,这些整数未排序。我们需要以最有效的方式在2个数组的并集中找到第k个排序元素。 (请不要发布关于合并数组的答案,然后对它们进行排序以返回合并数组中的第k个索引)

2 个答案:

答案 0 :(得分:2)

您可以使用selection algorithm在O(N)时间内找到Kth项,其中N是数组大小的总和。显然,您将两个数组视为一个大型数组。

答案 1 :(得分:2)

阵列联合可以在线性时间内完成。我正在跳过这一部分。

您可以使用partition中使用的quick sort()算法。在快速排序中,该函数将必须递归两个分支。但是在这里我们只是有条件地调用递归调用,因此只有1分支递归。

主要概念partition()会将所选的PIVOT元素放置在适当的排序位置。因此,我们可以使用此属性来选择我们感兴趣的数组的一半,并在这一半上进行递归。这将阻止我们对整个数组进行排序。

我根据上述概念编写了以下代码。假设等级= 0表示数组中的最小元素。

void swap (int *a, int *b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

int partition (int a[], int start, int end)
{
    /* choose a fixed pivot for now */
    int pivot = a[end];
    int i = start, j;

    for (j = start; j <= end-1; j++) {
        if (a[j] < pivot) {
            swap (&a[i], &a[j]);
            i++;
        }
    } 
    /* Now swap the ith element with the pivot */
    swap (&a[i], &a[end]);
    return i;
}

int find_k_rank (int a[], int start, int end, int k)
{
    int x = partition (a, start, end);
    if (x == k) {
        return a[x];
    } else if (k < x) {
        return  find_k_rank (a, start, x-1, k);
    } else {
        return find_k_rank (a, x+1, end, k);
    }
}

int main()
{
    int a[] = {10,2,7,4,8,3,1,5,9,6};
    int N = 10;
    int rank = 3;
    printf ("%d\n", find_k_rank (a, 0, N-1, rank));
}