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