一、多个有序数组合并
多个有序数组合并成一个有序数组
思路:1.两两合并
2.使用最小堆,每次取堆顶元素,出堆,把该元素所在数组的下一个元素入堆。
//多个有序数组排序
struct node {
int val; // 元素值
int k; //元素所在数组
int i; // 元素所在数组下标
};
struct compare
{
bool operator()(node node1, node node2)
{
return node1.val > node2.val;//这是小根堆
}
};
void mul_sort(vector<vector<int>>&nums, vector<int> &res) {
int k = nums.size();
priority_queue<node, vector<node>, compare> que;
for (int i = 0; i < k; i++) { que.push({ nums[i][0],i,0 }); }
int sum = res.size();
for (int j = 0; j < sum; j++) {
node currt = que.top();
que.pop();
res[j] = currt.val;
node next;
next.i = currt.i + 1;
next.k = currt.k;
next.val = next.i >= nums[currt.k].size() ? INT_MAX : nums[currt.k][next.i];
que.push(next);
}
}
int main() {
vector<vector<int>> nums = { {2,3,3},{1,2,4},{5,6,7} };
vector<int> res(9);
mul_sort(nums, res);
for (auto c : res) cout << c << endl;
}