# Print elements of an array according to the order defined by another array | set 2

• Difficulty Level : Medium
• Last Updated : 24 Nov, 2022

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 ``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 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`

## Javascript

 ``

Output:

`2 2 1 1 8 8 3 5 6 7 9`

My Personal Notes arrow_drop_up