📜  以排序顺序合并两个未排序的数组

📅  最后修改于: 2021-04-29 08:30:35             🧑  作者: Mango

编写一个SortedMerge()函数,该函数接受两个列表,每个列表都是未排序的,然后将两个列表合并到一个按排序(递增)顺序的新列表中。 SortedMerge()应该返回新列表。

例子 :

Input : a[] = {10, 5, 15}
        b[] = {20, 3, 2}
Output : Merge List :
        {2, 3, 5, 10, 15, 20}

Input : a[] = {1, 10, 5, 15}
        b[] = {20, 0, 2}
Output : Merge List :
        {0, 1, 2, 5, 10, 15, 20}

有很多情况要处理:’a’或’b’可能为空,在处理过程中’a’或’b’可能首先用尽,最后存在将结果列表开始为空并构建它的问题穿过“ a”和“ b”时向上移动。

方法1(首先串联然后排序)

在这种情况下,我们首先附加两个未排序的列表。然后,我们仅对串联列表进行排序。

C++
// CPP program to merge two unsorted lists 
// in sorted order
#include 
using namespace std;
  
// Function to merge array in sorted order
void sortedMerge(int a[], int b[], int res[], 
                                int n, int m)
{
    // Concatenate two arrays
    int i = 0, j = 0, k = 0;
    while (i < n) {
        res[k] = a[i];
        i += 1;
        k += 1;
    }
    while (j < m) {
        res[k] = b[j];
        j += 1;
        k += 1;
    }
  
    // sorting the res array
    sort(res, res + n + m);
}
  
// Driver code
int main()
{
    int a[] = { 10, 5, 15 };
    int b[] = { 20, 3, 2, 12 };
    int n = sizeof(a) / sizeof(a[0]);
    int m = sizeof(b) / sizeof(b[0]);
  
    // Final merge list
    int res[n + m];
    sortedMerge(a, b, res, n, m);
  
    cout << "Sorted merged list :";
    for (int i = 0; i < n + m; i++)
        cout << " " << res[i];
    cout << "n";
  
    return 0;
}


Java
// Java Code for Merging two unsorted
// arrays in sorted order
import java.util.*;
  
class GFG {
  
    // Function to merge array in sorted order
    public static void sortedMerge(int a[], int b[], 
                                   int res[], int n, 
                                   int m)
    {
        // Concatenate two arrays
        int i = 0, j = 0, k = 0;
        while (i < n) {
            res[k] = a[i];
            i++;
            k++;
        }
          
        while (j < m) {
            res[k] = b[j];
            j++;
            k++;
        }
      
        // sorting the res array
        Arrays.sort(res);
    }
      
    /* Driver program to test above function */
    public static void main(String[] args) 
    {
        int a[] = { 10, 5, 15 };
        int b[] = { 20, 3, 2, 12 };
        int n = a.length;
        int m = b.length;
      
        // Final merge list
        int res[]=new int[n + m];
        sortedMerge(a, b, res, n, m);
      
        System.out.print("Sorted merged list :");
        for (int i = 0; i < n + m; i++)
            System.out.print(" " + res[i]); 
    }
}
  
// This code is contributed by Arnav Kr. Mandal.


Python
# Python program to merge two unsorted lists 
# in sorted order
  
# Function to merge array in sorted order
def sortedMerge(a, b, res, n, m):
    # Concatenate two arrays
    i, j, k = 0, 0, 0
    while (i < n):
        res[k] = a[i]
        i += 1
        k += 1
    while (j < m):
        res[k] = b[j]
        j += 1
        k += 1
   
    # sorting the res array
    res.sort()
   
# Driver code
a = [ 10, 5, 15 ]
b = [ 20, 3, 2, 12 ]
n = len(a)
m = len(b)
  
# Final merge list
res = [0 for i in range(n + m)]
sortedMerge(a, b, res, n, m)
print "Sorted merged list :"
for i in range(n + m):
    print res[i],
      
# This code is contributed by Sachin Bisht


C#
// C# Code for Merging two 
// unsorted arrays in sorted order
using System;
  
class GFG {
  
    // Function to merge array in sorted order
    public static void sortedMerge(int []a, int []b, 
                                   int []res, int n, 
                                   int m)
    {
        // Concatenate two arrays
        int i = 0, j = 0, k = 0;
        while (i < n) {
            res[k] = a[i];
            i++;
            k++;
        }
          
        while (j < m) {
            res[k] = b[j];
            j++;
            k++;
        }
      
        // sorting the res array
        Array.Sort(res);
    }
      
    /* Driver program to test above function */
    public static void Main() 
    {
        int []a = {10, 5, 15};
        int []b = {20, 3, 2, 12};
        int n = a.Length;
        int m = b.Length;
      
        // Final merge list
        int []res=new int[n + m];
        sortedMerge(a, b, res, n, m);
      
        Console.Write("Sorted merged list :");
        for (int i = 0; i < n + m; i++)
            Console.Write(" " + res[i]); 
    }
}
  
// This code is contributed by nitin mittal.


PHP


C++
// CPP program to merge two unsorted lists 
// in sorted order
#include 
using namespace std;
  
// Function to merge array in sorted order
void sortedMerge(int a[], int b[], int res[], 
                                int n, int m)
{
    // Sorting a[] and b[]
    sort(a, a + n);
    sort(b, b + m);
  
    // Merge two sorted arrays into res[]
    int i = 0, j = 0, k = 0;
    while (i < n && j < m) {
        if (a[i] <= b[j]) {
            res[k] = a[i];
            i += 1;
            k += 1;
        } else {
            res[k] = b[j];
            j += 1;
            k += 1;
        }
    }    
    while (i < n) {  // Merging remaining
                     // elements of a[] (if any)
        res[k] = a[i];
        i += 1;
        k += 1;
    }    
    while (j < m) {   // Merging remaining
                     // elements of b[] (if any)
        res[k] = b[j];
        j += 1;
        k += 1;
    }
}
  
// Driver code
int main()
{
    int a[] = { 10, 5, 15 };
    int b[] = { 20, 3, 2, 12 };
    int n = sizeof(a) / sizeof(a[0]);
    int m = sizeof(b) / sizeof(b[0]);
  
    // Final merge list
    int res[n + m];
  
    sortedMerge(a, b, res, n, m);
  
    cout << "Sorted merge list :";
    for (int i = 0; i < n + m; i++)
        cout << " " << res[i];
    cout << "n";
  
    return 0;
}


Java
// JAVA Code for Merging two unsorted 
// arrays in sorted order
import java.util.*;
  
class GFG {
      
    // Function to merge array in sorted order
    public static void sortedMerge(int a[], int b[],
                                  int res[], int n,
                                            int m)
    {
        // Sorting a[] and b[]
        Arrays.sort(a);
        Arrays.sort(b);
       
        // Merge two sorted arrays into res[]
        int i = 0, j = 0, k = 0;
        while (i < n && j < m) {
            if (a[i] <= b[j]) {
                res[k] = a[i];
                i += 1;
                k += 1;
            } else {
                res[k] = b[j];
                j += 1;
                k += 1;
            }
        }    
          
        while (i < n) {  // Merging remaining
                         // elements of a[] (if any)
            res[k] = a[i];
            i += 1;
            k += 1;
        }    
        while (j < m) {   // Merging remaining
                         // elements of b[] (if any)
            res[k] = b[j];
            j += 1;
            k += 1;
        }
    }
      
    /* Driver program to test above function */
    public static void main(String[] args) 
    {
        int a[] = { 10, 5, 15 };
        int b[] = { 20, 3, 2, 12 };
        int n = a.length;
        int m = b.length;
       
        // Final merge list
        int res[] = new int[n + m];
        sortedMerge(a, b, res, n, m);
       
        System.out.print( "Sorted merged list :");
        for (int i = 0; i < n + m; i++)
            System.out.print(" " + res[i]);   
    }
}
// This code is contributed by Arnav Kr. Mandal.


Python
# Python program to merge two unsorted lists 
# in sorted order
  
# Function to merge array in sorted order
def sortedMerge(a, b, res, n, m):
    # Sorting a[] and b[]
    a.sort()
    b.sort()
      
    # Merge two sorted arrays into res[]
    i, j, k = 0, 0, 0
    while (i < n and j < m):
        if (a[i] <= b[j]):
            res[k] = a[i]
            i += 1
            k += 1
        else:
            res[k] = b[j]
            j += 1
            k += 1
              
    while (i < n):  # Merging remaining
                    # elements of a[] (if any)
        res[k] = a[i]
        i += 1
        k += 1
          
    while (j < m):  # Merging remaining
                    # elements of b[] (if any)
        res[k] = b[j]
        j += 1
        k += 1
   
# Driver code
a = [ 10, 5, 15 ]
b = [ 20, 3, 2, 12 ]
n = len(a)
m = len(b)
  
# Final merge list
res = [0 for i in range(n + m)]
sortedMerge(a, b, res, n, m)
print "Sorted merged list :"
for i in range(n + m):
    print res[i],
      
# This code is contributed by Sachin Bisht


C#
// C# Code for Merging two unsorted 
// arrays in sorted order
using System; 
  
class GFG {
      
    // Function to merge array in 
    // sorted order
    static void sortedMerge(int []a, int []b,
                     int []res, int n, int m)
    {
          
        // Sorting a[] and b[]
        Array.Sort(a);
        Array.Sort(b);
      
        // Merge two sorted arrays into res[]
        int i = 0, j = 0, k = 0;
          
        while (i < n && j < m)
        {
            if (a[i] <= b[j])
            {
                res[k] = a[i];
                i += 1;
                k += 1;
            } 
            else 
            {
                res[k] = b[j];
                j += 1;
                k += 1;
            }
        } 
          
        while (i < n)
        { 
              
            // Merging remaining
            // elements of a[] (if any)
            res[k] = a[i];
            i += 1;
            k += 1;
        } 
        while (j < m)
        {
              
            // Merging remaining
            // elements of b[] (if any)
            res[k] = b[j];
            j += 1;
            k += 1;
        }
    }
      
    /* Driver program to test
    above function */
    public static void Main() 
    {
        int []a = { 10, 5, 15 };
        int []b = { 20, 3, 2, 12 };
        int n = a.Length;
        int m = b.Length;
      
        // Final merge list
        int []res = new int[n + m];
        sortedMerge(a, b, res, n, m);
      
        Console.Write( "Sorted merged list :");
        for (int i = 0; i < n + m; i++)
            Console.Write(" " + res[i]); 
    }
}
  
// This code is contributed by nitin mittal.


输出 :

Sorted merged list : 2 3 5 10 12 15 20

时间复杂度: O((n + m)(log(n + m)))
辅助空间: O((n + m))

方法2(先排序然后合并)

我们首先将两个给定的数组分别排序。然后,我们简单地合并两个排序的数组。

C++

// CPP program to merge two unsorted lists 
// in sorted order
#include 
using namespace std;
  
// Function to merge array in sorted order
void sortedMerge(int a[], int b[], int res[], 
                                int n, int m)
{
    // Sorting a[] and b[]
    sort(a, a + n);
    sort(b, b + m);
  
    // Merge two sorted arrays into res[]
    int i = 0, j = 0, k = 0;
    while (i < n && j < m) {
        if (a[i] <= b[j]) {
            res[k] = a[i];
            i += 1;
            k += 1;
        } else {
            res[k] = b[j];
            j += 1;
            k += 1;
        }
    }    
    while (i < n) {  // Merging remaining
                     // elements of a[] (if any)
        res[k] = a[i];
        i += 1;
        k += 1;
    }    
    while (j < m) {   // Merging remaining
                     // elements of b[] (if any)
        res[k] = b[j];
        j += 1;
        k += 1;
    }
}
  
// Driver code
int main()
{
    int a[] = { 10, 5, 15 };
    int b[] = { 20, 3, 2, 12 };
    int n = sizeof(a) / sizeof(a[0]);
    int m = sizeof(b) / sizeof(b[0]);
  
    // Final merge list
    int res[n + m];
  
    sortedMerge(a, b, res, n, m);
  
    cout << "Sorted merge list :";
    for (int i = 0; i < n + m; i++)
        cout << " " << res[i];
    cout << "n";
  
    return 0;
}

Java

// JAVA Code for Merging two unsorted 
// arrays in sorted order
import java.util.*;
  
class GFG {
      
    // Function to merge array in sorted order
    public static void sortedMerge(int a[], int b[],
                                  int res[], int n,
                                            int m)
    {
        // Sorting a[] and b[]
        Arrays.sort(a);
        Arrays.sort(b);
       
        // Merge two sorted arrays into res[]
        int i = 0, j = 0, k = 0;
        while (i < n && j < m) {
            if (a[i] <= b[j]) {
                res[k] = a[i];
                i += 1;
                k += 1;
            } else {
                res[k] = b[j];
                j += 1;
                k += 1;
            }
        }    
          
        while (i < n) {  // Merging remaining
                         // elements of a[] (if any)
            res[k] = a[i];
            i += 1;
            k += 1;
        }    
        while (j < m) {   // Merging remaining
                         // elements of b[] (if any)
            res[k] = b[j];
            j += 1;
            k += 1;
        }
    }
      
    /* Driver program to test above function */
    public static void main(String[] args) 
    {
        int a[] = { 10, 5, 15 };
        int b[] = { 20, 3, 2, 12 };
        int n = a.length;
        int m = b.length;
       
        // Final merge list
        int res[] = new int[n + m];
        sortedMerge(a, b, res, n, m);
       
        System.out.print( "Sorted merged list :");
        for (int i = 0; i < n + m; i++)
            System.out.print(" " + res[i]);   
    }
}
// This code is contributed by Arnav Kr. Mandal.

Python

# Python program to merge two unsorted lists 
# in sorted order
  
# Function to merge array in sorted order
def sortedMerge(a, b, res, n, m):
    # Sorting a[] and b[]
    a.sort()
    b.sort()
      
    # Merge two sorted arrays into res[]
    i, j, k = 0, 0, 0
    while (i < n and j < m):
        if (a[i] <= b[j]):
            res[k] = a[i]
            i += 1
            k += 1
        else:
            res[k] = b[j]
            j += 1
            k += 1
              
    while (i < n):  # Merging remaining
                    # elements of a[] (if any)
        res[k] = a[i]
        i += 1
        k += 1
          
    while (j < m):  # Merging remaining
                    # elements of b[] (if any)
        res[k] = b[j]
        j += 1
        k += 1
   
# Driver code
a = [ 10, 5, 15 ]
b = [ 20, 3, 2, 12 ]
n = len(a)
m = len(b)
  
# Final merge list
res = [0 for i in range(n + m)]
sortedMerge(a, b, res, n, m)
print "Sorted merged list :"
for i in range(n + m):
    print res[i],
      
# This code is contributed by Sachin Bisht    

C#

// C# Code for Merging two unsorted 
// arrays in sorted order
using System; 
  
class GFG {
      
    // Function to merge array in 
    // sorted order
    static void sortedMerge(int []a, int []b,
                     int []res, int n, int m)
    {
          
        // Sorting a[] and b[]
        Array.Sort(a);
        Array.Sort(b);
      
        // Merge two sorted arrays into res[]
        int i = 0, j = 0, k = 0;
          
        while (i < n && j < m)
        {
            if (a[i] <= b[j])
            {
                res[k] = a[i];
                i += 1;
                k += 1;
            } 
            else 
            {
                res[k] = b[j];
                j += 1;
                k += 1;
            }
        } 
          
        while (i < n)
        { 
              
            // Merging remaining
            // elements of a[] (if any)
            res[k] = a[i];
            i += 1;
            k += 1;
        } 
        while (j < m)
        {
              
            // Merging remaining
            // elements of b[] (if any)
            res[k] = b[j];
            j += 1;
            k += 1;
        }
    }
      
    /* Driver program to test
    above function */
    public static void Main() 
    {
        int []a = { 10, 5, 15 };
        int []b = { 20, 3, 2, 12 };
        int n = a.Length;
        int m = b.Length;
      
        // Final merge list
        int []res = new int[n + m];
        sortedMerge(a, b, res, n, m);
      
        Console.Write( "Sorted merged list :");
        for (int i = 0; i < n + m; i++)
            Console.Write(" " + res[i]); 
    }
}
  
// This code is contributed by nitin mittal.

输出 :

Sorted merge list : 2 3 5 10 12 15 20

时间复杂度: O(nlogn + mlogm +(n + m))
空间复杂度: O((n + m))

从上面的时间复杂度可以明显看出,方法2优于方法1