使用优先队列合并两个排序数组
给定两个大小分别为N和M的排序数组A[]和B[] ,任务是以排序方式合并它们。
例子:
Input: A[] = { 5, 6, 8 }, B[] = { 4, 7, 8 }
Output: 4 5 6 7 8 8
Input: A[] = {1, 3, 4, 5}, B] = {2, 4, 6, 8}
Output: 1 2 3 4 4 5 6 8
Input: A[] = {5, 8, 9}, B[] = {4, 7, 8}
Output: 4 5 7 8 8 9
方法:给定的问题,使用 minheap 合并两个排序数组已经存在。但是这里的想法是使用一个priority_queue来实现STL提供的最小堆。请按照以下步骤解决问题:
- 初始化一个最小优先级队列,比如PQ来实现最小堆。
- 遍历数组A[],将数组的所有元素压入PQ中。
- 遍历数组B[],将数组的所有元素压入PQ中。
- 现在将PQ的所有元素放入一个数组中,比如res[]一个一个地弹出PQ的顶部元素。
- 最后,打印排序后的数组res[]作为答案。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to merge two arrays
void merge(int A[], int B[], int N, int M)
{
// Stores the merged array
int res[N + M];
// Create a min priority_queue
priority_queue, greater > pq;
// Traverse the array A[]
for (int i = 0; i < N; i++)
pq.push(A[i]);
// Traverse the array B[]
for (int i = 0; i < M; i++)
pq.push(B[i]);
int j = 0;
// Iterate until the
// pq is not empty
while (!pq.empty()) {
// Stores the top element
// of pq into res[j]
res[j++] = pq.top();
// Removes the top element
pq.pop();
}
// Print the merged array
for (int i = 0; i < N + M; i++)
cout << res[i] << ' ';
}
// Driver Code
int main()
{
// Input
int A[] = { 5, 6, 8 };
int B[] = { 4, 7, 8 };
int N = sizeof(A) / sizeof(A[0]);
int M = sizeof(B) / sizeof(B[0]);
// Function call
merge(A, B, N, M);
return 0;
}
Java
// Java program for the above approach
import java.util.*;
class GFG{
// Function to merge two arrays
static void merge(int A[], int B[], int N, int M)
{
// Stores the merged array
int []res = new int[N + M];
// Create a min priority_queue
Queue pq = new PriorityQueue<>();
// Traverse the array A[]
for(int i = 0; i < N; i++)
pq.add(A[i]);
// Traverse the array B[]
for(int i = 0; i < M; i++)
pq.add(B[i]);
int j = 0;
// Iterate until the
// pq is not empty
while (!pq.isEmpty())
{
// Stores the top element
// of pq into res[j]
res[j++] = pq.peek();
// Removes the top element
pq.remove();
}
// Print the merged array
for(int i = 0; i < N + M; i++)
System.out.print(res[i] + " ");
}
// Driver Code
public static void main(String[] args)
{
// Input
int A[] = { 5, 6, 8 };
int B[] = { 4, 7, 8 };
int N = A.length;
int M = B.length;
// Function call
merge(A, B, N, M);
}
}
// This code is contributed by todaysgaurav
Python3
# Python3 program for the above approach
from queue import PriorityQueue
# Function to merge two arrays
def merge(A, B, N, M):
# Stores the merged array
res = [0 for i in range(N + M)]
# Create a min priority_queue
pq = PriorityQueue()
# Traverse the array A[]
for i in range(N):
pq.put(A[i])
# Traverse the array B[]
for i in range(M):
pq.put(B[i])
j = 0
# Iterate until the
# pq is not empty
while not pq.empty():
# Removes the top element and
# stores it into res[j]
res[j] = pq.get()
j += 1
# Print the merged array
for i in range(N + M):
print(res[i], end = " ")
# return back to main
return
# Driver code
if __name__ == '__main__':
# Input
A = [ 5, 6, 8 ]
B = [ 4, 7, 8 ]
N = len(A)
M = len(B)
# Function call
merge(A, B, N, M)
# This code is contributed by MuskanKalra1
Javascript
输出
4 5 6 7 8 8
时间复杂度: O((N+M)*log(N+M))
辅助空间: O(N+M)