假设我们有两个数组A []和B []。每个数组包含n个不分类的不同整数。我们需要以最有效的方式在2个数组的联合中找到第k个排名元素。 (请不要有关合并的阵列,然后对它们进行排序,以合并后的数组中返回第k个指标后回答)K排列在2个未分类阵列中的元素
2
A
回答
2
可以使用selection algorithm找到第K项,在O(n)的时间,其中N是总和的阵列大小。显然,你将这两个数组视为一个大数组。
+0
我知道这个方法,但我需要一个更好的复杂度 – user3600483
+2
找到未排序列表中的第K个项目没有比O(N)更好的复杂性。 –
2
数组的联合可以在线性时间内完成。我正在跳过这部分。
您可以使用quick sort
中使用的partition
()算法。在快速排序中,该功能将不得不递归两个分支。然而,在这里,我们将有条件地调用递归调用,因此只有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));
}
相关问题
- 1. 排列中第k个最大元素
- 2. 从另一个阵列中排除一个阵列的元素
- 3. 在多个阵列的循环中排列打印元素
- 4. 萨姆在阵列的任何k个元素的若干
- 5. PHP Sort排列元素的阵列
- 6. 蟒 - 选择第1列的每个值在排序numpy的矩阵塔2的顶部k个元素
- 7. 快速选择至少有k个元素与主阵列相同的阵列
- 8. 序言:k元素与元素总和的排列S
- 9. 查找阵列中不在另一个阵列中的元素
- 10. 2D阵列,其中每个元素是一个类元素
- 11. R - 选择列的第k个元素
- 12. 设置阵列阵列中的元素
- 13. 阵列中的阵列打印元素
- 14. 将阵列1中的每个元素与阵列2中的每个元素结合起来
- 15. 排序阵列由元件[1]元素[2]
- 16. 排列算法的K个最大元素
- 17. 发现排列第k个最大的元素袋
- 18. 在新阵列中划分2个阵列的错误
- 19. 重新排列的数组元素为两个新的阵列
- 20. Matlab的:将一个单元阵列分成两个列单元的排列
- 21. 未设置元素阵列键未知
- 22. 排序阵列元素的问题
- 23. Javascript排序阵列内的元素
- 24. 排序矩阵中第K个最小元素
- 25. 查找未排序数组中的第k个最小元素
- 26. 查找阵列的最后一个元素中JSON列类型
- 27. 排序阵列只使用阵列的第一个元素在PHP
- 28. 基于另一个阵列的键排列数组元素
- 29. 分而治之 - 未分类数组的k元素
- 30. 排序并排2个阵列侧
不同之处在于它们是独特的,例如A [8 3 2 4 12]和B [6 11 1 5 9]。所有元素都是小于10000000的整数,并且元素不必是连续的。 – user3600483
这只是一个例子。我们需要解决未分类数组的一般情况。我已更新评论以避免混淆。 – user3600483