📜  使用优先队列合并两个排序数组

📅  最后修改于: 2022-05-13 01:56:09.016000             🧑  作者: Mango

使用优先队列合并两个排序数组

给定两个大小分别为NM的排序数组A[]B[] ,任务是以排序方式合并它们。

例子:

方法:给定的问题,使用 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)