Print elements of an array according to the order defined by another array | set 2
Last Updated :
10 Feb, 2023
Given two arrays a1[] and a2[], print elements of a1 in such a way that the relative order among the elements will be the same as those are in a2. That is, elements which come before in the array a2[], print those elements first from the array a1[]. For the elements not present in a2, print them at last in sorted order.
It is also given that the number of elements in a2[] is smaller than or equal to the number of elements in a1[], and a2[] has all distinct elements.
Example:
Input: a1[] = {2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8}
a2[] = {2, 1, 8, 3}
Output: 2 2 1 1 8 8 3 5 6 7 9
Input: a1[] = {2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8}
a2[] = {1, 10, 11}
Output: 1 1 2 2 3 5 6 7 8 8 9
Simple Approach: We create a temporary array and a visited array where the temporary array is used to copy contents of a1[] to it and visited array is used to mark those elements in the temporary array which are copied to a1[]. Then sorting the temporary array and doing a binary search for every element of a2[] in a1[]. You can find the solution here.
Efficient Approach: We can print the elements of a1[] according to the order defined by a2[] using map in c++ in O(mlog(n)) time. We traverse through a1[] and store the frequency of every number in a map. Then we traverse through a2[] and check if the number is present in the map. If the number is present, then print it that many times and erase the number from the map. Print the rest of the numbers present in the map sequentially as numbers are stored in the map in sorted order.
Below is the implementation of the above approach:
C++
// A C++ program to print an array according
// to the order defined by another array
#include <bits/stdc++.h>
using namespace std;
// Function to print an array according
// to the order defined by another array
void print_in_order(int a1[], int a2[], int n, int m)
{
// Declaring map and iterator
map<int, int> mp;
map<int, int>::iterator itr;
// Store the frequency of each
// number of a1[] int the map
for (int i = 0; i < n; i++)
mp[a1[i]]++;
// Traverse through a2[]
for (int i = 0; i < m; i++) {
// Check whether number
// is present in map or not
if (mp.find(a2[i]) != mp.end()) {
itr = mp.find(a2[i]);
// Print that number that
// many times of its frequency
for (int j = 0; j < itr->second; j++)
cout << itr->first << " ";
mp.erase(a2[i]);
}
}
// Print those numbers that are not
// present in a2[]
for (itr = mp.begin(); itr != mp.end(); itr++) {
for (int j = 0; j < itr->second; j++)
cout << itr->first << " ";
}
cout << endl;
}
// Driver code
int main()
{
int a1[] = { 2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8 };
int a2[] = { 2, 1, 8, 3 };
int n = sizeof(a1) / sizeof(a1[0]);
int m = sizeof(a2) / sizeof(a2[0]);
print_in_order(a1, a2, n, m);
return 0;
}
Java
/*package whatever //do not write package name here */
import java.util.*;
class GFG {
// Function to print an array according
// to the order defined by another array
static void print_in_order(int a1[], int a2[], int n, int m)
{
// Declaring map and iterator
HashMap<Integer, Integer> mp = new HashMap<>();
// Store the frequency of each
// number of a1[] int the map
for (int i = 0; i < n; i++)
mp.put(a1[i],mp.getOrDefault(a1[i],0)+1);
// Traverse through a2[]
for (int i = 0; i < m; i++) {
// Check whether number
// is present in map or not
if (mp.containsKey(a2[i])) {
// Print that number that
// many times of its frequency
for (int j = 0; j < mp.get(a2[i]); j++)
System.out.print(a2[i] + " ");
mp.remove(a2[i]);
}
}
// Print those numbers that are not
// present in a2[]
for (int i:mp.keySet()) {
for (int j = 0; j < mp.get(i); j++)
System.out.print(i + " ");
}
System.out.println();
}
public static void main (String[] args) {
int a1[] = { 2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8 };
int a2[] = { 2, 1, 8, 3 };
int n = a1.length;
int m = a2.length;
print_in_order(a1, a2, n, m);
}
}
// This code is contributed by aadityaburujwale.
Python3
# A Python3 program to print an array according
# to the order defined by another array
# Function to print an array according
# to the order defined by another array
def print_in_order(a1, a2, n, m) :
# Declaring map and iterator
mp = dict.fromkeys(a1,0);
# Store the frequency of each
# number of a1[] int the map
for i in range(n) :
mp[a1[i]] += 1;
# Traverse through a2[]
for i in range(m) :
# Check whether number
# is present in map or not
if a2[i] in mp.keys() :
# Print that number that
# many times of its frequency
for j in range(mp[a2[i]]) :
print(a2[i],end=" ");
del(mp[a2[i]]);
# Print those numbers that are not
# present in a2[]
for key,value in mp.items() :
for j in range(value) :
print(key,end=" ");
print();
# Driver code
if __name__ == "__main__" :
a1 = [ 2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8 ];
a2 = [ 2, 1, 8, 3 ];
n =len(a1);
m = len(a2);
print_in_order(a1, a2, n, m);
# This code is contributed by AnkitRai01
C#
using System;
using System.Collections.Generic;
class GFG {
static void PrintInOrder(int[] a1, int[] a2)
{
Dictionary<int, int> dict
= new Dictionary<int, int>();
// Store the frequency of each
// number of a1[] int the dictionary
for (int i = 0; i < a1.Length; i++) {
if (dict.ContainsKey(a1[i]))
dict[a1[i]]++;
else
dict.Add(a1[i], 1);
}
// Traverse through a2[]
for (int i = 0; i < a2.Length; i++) {
// Check whether number
// is present in dictionary or not
if (dict.ContainsKey(a2[i])) {
// Print that number that
// many times of its frequency
for (int j = 0; j < dict[a2[i]]; j++)
Console.Write(a2[i] + " ");
dict.Remove(a2[i]);
}
}
// Print those numbers that are not
// present in a2[]
foreach(var pair in dict)
{
for (int j = 0; j < pair.Value; j++)
Console.Write(pair.Key + " ");
}
Console.WriteLine();
}
static void Main(string[] args)
{
int[] a1 = { 2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8 };
int[] a2 = { 2, 1, 8, 3 };
PrintInOrder(a1, a2);
}
}
JavaScript
<script>
// A JavaScript program to print an array according
// to the order defined by another array
// Function to print an array according
// to the order defined by another array
function print_in_order(a1, a2, n, m){
// Declaring map and iterator
let mp = new Map();
// Store the frequency of each
// number of a1[] int the map
for(let i=0;i<n;i++){
if(mp.has(a1[i]))
mp.set(a1[i],mp.get(a1[i])+1);
else
mp.set(a1[i],1);
}
// Traverse through a2[]
for(let i=0;i<m;i++){
// Check whether number
// is present in map or not
if(mp.has(a2[i])){
// Print that number that
// many times of its frequency
for(let j=0;j<mp.get(a2[i]);j++)
document.write(a2[i]," ");
mp.delete(a2[i]);
}
}
// Print those numbers that are not
// present in a2[]
for(let [key,value] of mp)
for(let j=0;j<value;j++)
document.write(key," ");
document.write("</br>");
}
// Driver code
let a1 = [ 2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8 ];
let a2 = [ 2, 1, 8, 3 ];
let n = a1.length;
let m = a2.length;
print_in_order(a1, a2, n, m);
// This code is contributed by shinjanpatra
</script>
Output: 2 2 1 1 8 8 3 5 6 7 9
Similar Reads
Sort an array according to the order defined by another array Given two arrays arr1[] and arr2[] of size m and n, the task is to sort arr1[] such that the relative order among the elements matches the order in arr2[]. For elements not present in arr2[], append them at the end in sorted order.Example: Input: arr1[] = {2, 1, 2, 5, 7, 1, 9, 3, 6, 8, 8} arr2[] = {
13 min read
Sorting an array according to another array using pair in STL We are given two arrays. We need to sort one array according to another. Examples: Input : 2 1 5 4 9 3 6 7 10 8 A B C D E F G H I JOutput : 1 2 3 4 5 6 7 8 9 10 B A F D C G H J E I Here we are sorting second array(a character array) according to the first array (an integer array).We have discussed d
6 min read
Check whether an array can be fit into another array rearranging the elements in the array Given two arrays A and B of the same size N. Check whether array A can be fit into array B. An array is said to fit into another array if by arranging the elements of both arrays, there exists a solution such that the ith element of the first array is less than or equal to ith element of the second
6 min read
Find whether an array is subset of another array using Map Given two arrays: arr1[0..m-1] and arr2[0..n-1]. Find whether arr2[] is a subset of arr1[] or not. Both the arrays are not in sorted order. It may be assumed that elements in both arrays are distinct.Examples: Input: arr1[] = {11, 1, 13, 21, 3, 7}, arr2[] = {11, 3, 7, 1} Output: arr2[] is a subset o
7 min read
Count Array elements that occur before any of its prefix value of another Array Given two arrays A[] and B[] of size N each, the task is to find the number of elements in array B[] that occur before any element that was present before it in array A[]. Example: Input: N = 5, A[] = {3, 5, 1, 2, 4}, B[] = {4, 3, 1, 5, 2}Output: 2Explanation: Array A represent that 3 comes first th
6 min read