这是我的使用C++ STL的代码
#include<iostream>
#include<vector>
#include<climits>
#include<queue>
#define ROWS 4
#define COLS 8
using namespace std;
struct node
{
int ele;
int arr_no;
int next_index;
};
void printVector(vector<int> v)
{
for(unsigned int i=0;i<v.size();i++)
cout<<v[i]<<" ";
}
class compare
{
public:
bool operator()(node& n1, node& n2)
{
if (n1.ele > n2.ele)
return true;
else
return false;
}
};
vector<int> mergeKArrays(vector< vector<int> > v)
{
int k = v.size();
int n = v.at(0).size();
vector<int> result;
priority_queue<node, vector<node>, compare> minHeap;
for (int i = 0; i < k; i++)
{
node temp;
temp.ele = v[i][0];
temp.arr_no = i;
temp.next_index = 1;
minHeap.push(temp);
}
for (int count = 0; count < n*k; count++)
{
node min_ele_node = minHeap.top();
minHeap.pop();
result.push_back(min_ele_node.ele);
node new_node;
new_node.arr_no = min_ele_node.arr_no;
if (min_ele_node.next_index < n)
{
new_node.ele = v.at(min_ele_node.arr_no)[min_ele_node.next_index];
new_node.next_index = min_ele_node.next_index + 1;
}
else
{
new_node.ele = INT_MAX;
}
minHeap.push(new_node);
}
return result;
}
int main()
{
int arr[ROWS][COLS] =
{
{10, 20, 30, 40, 50, 60, 71, 86},
{15, 25, 35, 45, 60, 69, 77, 78},
{27, 29, 37, 48, 50, 65, 75, 78},
{32, 33, 39, 50, 80, 133, 139, 150},
};
vector< vector<int> > matrix ;
for( int i=0 ; i < ROWS; i++)
{
vector<int> vec;
for(int j=0; j < COLS; j++)
vec.push_back(arr[i][j]);
matrix.push_back(vec);
}
vector<int> result = mergeKArrays(matrix);
printVector(result);
return 0;
}
n
个元素,并且每个元素都被插入/从k
大小的堆中删除。算法中的所有其他工作都被这些步骤“吸收”了。 - rliu