请用最小优先队列写出将两个无序数组合并成一个升序数组使用c++并using namespace std;
时间: 2024-10-20 11:13:37 浏览: 39
在C++中,我们可以使用最小堆(一种特殊的优先队列,堆顶总是最小元素)来合并两个无序数组,并保证结果数组始终有序。这里是一个简单的实现:
```cpp
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
// 将一个数组插入到堆中,保持堆的性质
void insertHeap(vector<int>& arr, priority_queue<int>& pq) {
for (int num : arr) {
pq.push(num);
}
}
// 从堆中取出最小元素并添加到结果数组
int popMin(priority_queue<int>& pq, vector<int>& result) {
int minElement = pq.top();
pq.pop();
result.push_back(minElement);
return minElement;
}
// 合并两个无序数组成升序数组
vector<int> mergeSortedArrays(vector<int>& arr1, vector<int>& arr2) {
priority_queue<int> pq1, pq2; // 使用两个堆分别存储两个数组
insertHeap(arr1, pq1);
insertHeap(arr2, pq2);
vector<int> result;
while (!pq1.empty() && !pq2.empty()) {
if (pq1.top() <= pq2.top()) { // 取较小的元素
result.push_back(popMin(pq1, result));
} else { // 另一个堆的元素小
result.push_back(popMin(pq2, result));
}
}
// 如果其中一个堆还有剩余,将其余元素全部加入结果
while (!pq1.empty()) {
result.push_back(popMin(pq1, result));
}
while (!pq2.empty()) {
result.push_back(popMin(pq2, result));
}
return result;
}
int main() {
vector<int> arr1 = {4, 1, 3, 2};
vector<int> arr2 = {6, 5, 7, 8};
vector<int> sortedArray = mergeSortedArrays(arr1, arr2);
for (int i : sortedArray) {
cout << i << " ";
}
return 0;
}
```
这个程序首先创建了两个最小堆,然后反复从每个堆中取出最小元素放入结果数组,直到其中一个堆为空。最后如果另一个堆还剩有元素,就直接将其添加到结果数组。
阅读全文