C++ program to Sort an array according to the order defined by another array
Sort an array according to the order defined by the other array
Here we will learn about C++ program to Sort an array according to the order defined by another array. We are given two arrays A [] and B [], sort A in such a way that the relative order among the elements will be the same as those are in B. The elements in array A has to be printed accordingly to the sequence of order of elements specified in array B, the rest of the elements, remaining in array A are printed at the end.
Here, we will discuss the following method for sorting the array according to the order that defined by another array.
- Method 1 : Using Sorting and Binary searching.
- Method 2 : By making customized comparator
- Method 3 : Using concept of hashing.
Let’s discuss above methods one by one in brief.
Method 1 :
- Declare a temporary array temp of size m and copy the contents of arr1[] to it.
- Declare another array visited[] and initialize all entries in it as false. visited[] is used to mark those elements in temp[] which are copied to arr1[].
- Sort temp[] using any sorting technique
- Declare the output index ind as 0.
- Do following for every element of arr2[i] in arr2[]
- Binary search for all occurrences of arr2[i] in temp[], if present then copy all occurrences to arr1[ind] and increment ind. Also mark the copied elements visited[]
- Copy all unvisited elements from temp[] to arr1[]
Method 1 : Code in C++
#include<bits/stdc++.h>
using namespace std;
int first(int arr[], int low, int high, int x, int n)
{
if (high >= low) {
int mid = low + (high - low) / 2;
if ((mid == 0 || x > arr[mid - 1]) && arr[mid] == x)
return mid;
if (x > arr[mid])
return first(arr, (mid + 1), high, x, n);
return first(arr, low, (mid - 1), x, n);
}
return -1;
}
void sortAccording(int A1[], int A2[], int m, int n)
{
int temp[m], visited[m];
for (int i = 0; i < m; i++) {
temp[i] = A1[i];
visited[i] = 0;
}
sort(temp, temp+m);
int ind = 0;
for (int i = 0; i < n; i++) {
int f = first(temp, 0, m - 1, A2[i], m);
if (f == -1)
continue;
for (int j = f; (j < m && temp[j] == A2[i]); j++) {
A1[ind++] = temp[j];
visited[j] = 1;
}
}
for (int i = 0; i < m; i++)
if (visited[i] == 0)
A1[ind++] = temp[i];
}
void printArray(int arr[], int n)
{
for (int i = 0; i < n; i++)
cout<<arr[i]<<" ";
cout<<endl;
}
// Driver Code
int main()
{
int arr1[] = { 20, 1, 20, 5, 7, 1, 9, 39, 6, 18, 18 };
int arr2[] = { 20, 1, 18, 39 };
int m = sizeof(arr1) / sizeof(arr1[0]);
int n = sizeof(arr2) / sizeof(arr2[0]);
sortAccording(arr1, arr2, m, n);
printArray(arr1, m);
return 0;
} Output
20 20 1 1 18 18 39 5 6 7 9
Method 2 :
In this method we will create our own customized compare method.
Method 2 : Code in C++
#include<bits/stdc++.h>
using namespace std;
void sortA1ByA2(vector &arr1 , vector &arr2){
unordered_map index;
for(int i=0; i<arr2.size(); i++){
if (index[arr2[i]] == 0) {
index[arr2[i]] = i+1;
}
}
auto comp = [&](int a , int b){
if(index[a] == 0 && index[b]==0) return a<b;
if(index[a] == 0) return false;
if(index[b] == 0) return true;
return index[a] < index[b];
};
sort(arr1.begin(), arr1.end() , comp);
}
int main(){
vector arr1{ 20, 1, 20, 5, 7, 1, 9, 39, 6, 18, 18 };
vector arr2{ 20, 1, 18, 39};
sortA1ByA2(arr1 , arr2);
for(auto i: arr1){
cout<<i<<" ";
}
return 0;
} Output
20 20 1 1 18 18 5 6 7 9 39
Method 3 :
- Run a loop over the arr1, store the count of every element in the map.
- Run a loop over arr2, check if it is present in map, if so, put in output array that many times and remove the number from map.
- Sort the rest of the numbers present in map and put in the output array.
Method 3 : Code in C++
#include <bits/stdc++.h>
using namespace std;
void sortA1ByA2(int A1[], int N, int A2[], int M, int ans[])
{
map<int, int> mp;
int ind = 0;
for (int i = 0; i < N; i++) {
mp[A1[i]] += 1;
}
for (int i = 0; i < M; i++) {
if (mp[A2[i]] != 0) {
for (int j = 1; j <= mp[A2[i]]; j++)
ans[ind++] = A2[i];
}
mp.erase(A2[i]);
}
for (auto it : mp) {
for (int j = 1; j <= it.second; j++)
ans[ind++] = it.first;
}
}
// Utility function to print an array
void printArray(int arr[], int n)
{
// Iterate in the array
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
cout << endl;
}
// Driver Code
int main()
{
int arr1[] = { 20, 1, 20, 5, 7, 1, 9, 39, 6, 18, 18 };
int arr2[] = { 20, 1, 18, 39 };
int n = sizeof(arr1) / sizeof(arr1[0]);
int m = sizeof(arr2) / sizeof(arr2[0]);
// The ans array is used to store the final sorted array
int ans[n];
sortA1ByA2(arr1, n, arr2, m, ans);
// Prints the sorted array
printArray(ans, n);
return 0;
} Output
20 20 1 1 18 18 39 5 6 7 9
Prime Course Trailer
Related Banners
Get PrepInsta Prime & get Access to all 200+ courses offered by PrepInsta in One Subscription

Login/Signup to comment