如何在两个不同大小的排序数组中找到第k个最大数字

时间:2014-05-23 02:18:46

标签: c++ arrays algorithm binary-search sortedlist

这与An algorithm to find the nth largest number in two arrays of size n的问题相同,除了两个排序的数组大小不同。

我试图实现类似于建议的算法版本以坚持我的问​​题,但我无法证明其正确性。 k = 6似乎失败。当算法结束时,返回的对分别是list1和list2的索引。

#include <iostream>
#include <utility>

using namespace std;

pair<int, int> smallestKElements(int list1[], int list2[], int k) {

// TODO: pass in the array sizes as parameters 
int m = 8; 
int n = 5;

// initialize array pointers such that i + j = k
int i = m/2;
int j = n/2; 
if (i + j + 2 < k) {
    while (i + j + 2 != k) {
        if (++i + j + 2 == k)
            break;
        if (i + ++j + 2 == k)
            break;
    }
} else if (i + j + 2 > k) {
    while (i + j + 2 != k) {
        if (--i + j + 2 == k)
            break;
        if (i + --j + 2 == k)
            break;
    }
}

// step forward in one array and step backward in another array
// decrement step size with every iteration until it is 0
int s = k/2; 
while (s > 0) {
    if (list1[i] < list2[j]) {
        if (m - 1 - i >= s &&
            j >= s) {

            i += s;
            j -= s;
        }
    } else {
        if (i >= s &&
            n - 1 - j >= s) {

            i -= s;
            j += s;
        }
    }
    s = s/2;
}

pair<int, int> r(i,j);
return r;
}

int main() {

int list1[] = {1, 4, 6, 7, 10, 11, 13, 27};
int list2[] = {2, 3, 20, 40, 60};

pair<int, int> test = smallestKElements(list1, list2, 6);
cout << test.first << "," << test.second << endl;

return 0;
}

1 个答案:

答案 0 :(得分:0)

好的,如果我理解你的问题,你可以为每个列表做类似的事情:

std::nth_element(lst, lst + k, begin(lst) + list_size, std::greater<int>());

请记住,您需要列表的大小。 您可以对其他阵列执行相同操作。这将修改数组,如果您不想修改数组,请创建std::reference_wrapper和nth_element数组。