# Sort an array of Strings according frequency

• Difficulty Level : Medium
• Last Updated : 26 May, 2022

Given an array of strings arr[], the task is to sort the array of strings according to the frequency of each string, in ascending order. If two elements have the same frequency, then they are sorted into lexicographical order.

Examples:

Input: arr[] = {“Geeks”, “for”, “Geeks”}
Output: {“for”, “Geeks”}
Explanation:
As the string “Geeks” has a frequency of 2 in the given array,
Hence, the position of the string “Geeks” will be 2

Input: arr[] = {“abc”, “pqr”, “pqr”, “abc”}
Output: {“abc”, “pqr”}
Explanation:
As both the strings have the same frequency, the array is sorted in the lexicographical order.

Approach The idea is to use a custom comparator to sort the array of strings with their frequency, as per the following steps.

• A map data structure is used to store the strings based on their frequency as (frequency, string) pairs.
• Sort these pairs with the help of a custom comparator such that if two strings have different frequencies, the string with a lower frequency is stored before. Otherwise, if the frequency is the same, then compare the strings lexicographically

Below is the implementation of the above approach:

## C++

 `// C++ implementation to sort the``// array of strings by its frequency` `#include ``using` `namespace` `std;` `// Custom comparator function to``// sort the string by its frequency``bool` `cmp(pair<``int``, string> x,``         ``pair<``int``, string> y)``{` `    ``// Condition to check if the``    ``// frequency of the string is less``    ``if` `(x.first < y.first) {``        ``return` `true``;``    ``}` `    ``// Condition to check if the``    ``// frequency of the string is greater``    ``else` `if` `(x.first > y.first) {``        ``return` `false``;``    ``}` `    ``// Condition when frequency of``    ``// the strings is equal``    ``else` `{` `        ``// Condition to check if the``        ``// first string is lexicographically``        ``// smaller than second string``        ``if` `(x.second < y.second) {``            ``return` `true``;``        ``}``        ``else` `{``            ``return` `false``;``        ``}``    ``}``}` `// Function to sort the array of strings``// by its frequency in the array``void` `printArraystring(string str[], ``int` `n)``{``    ``unordered_map m;` `    ``// Loop to store the frequency``    ``// of a string in a hash-map``    ``for` `(``int` `i = 0; i < n; i++) {``        ``m[str[i]]++;``    ``}` `    ``// Iterator for the map``    ``vector > vec;` `    ``// Loop to store the frequency and``    ``// string in a vector``    ``for` `(``auto` `it = m.begin(); it != m.end();``         ``it++) {``        ``vec.push_back(``            ``make_pair(it->second, it->first));``    ``}` `    ``// Sort the string``    ``// using custom comparator``    ``sort(vec.begin(), vec.end(), cmp);` `    ``// Loop to print the sorted vector``    ``for` `(``int` `i = 0; i < vec.size(); i++) {``        ``cout << vec[i].second << ``", "``;``    ``}``}` `// Driver Code``int` `main()``{``    ``string arr[] = { ``"Geeks"``, ``"for"``, ``"Geeks"``,``                     ``"for"``, ``"arc"` `};``    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr);` `    ``// Function to perform sorting``    ``printArraystring(arr, n);` `    ``return` `0;``}`

## Python 3

 `# Python 3 implementation to sort the``# array of strings by its frequency` `# Custom comparator function to``# sort the string by its frequency``def` `srt(x):``    ``for` `i ``in` `range``(``len``(x)``-``1``):``        ``for` `j ``in` `range``(i``+``1``,``len``(x)):``            ``if``(x[i][``0``]>x[j][``0``]):``                ``temp ``=` `x[j]``                ``x[j] ``=` `x[i]``                ``x[i] ``=` `temp``            ``elif``(x[i][``0``] ``=``=` `x[j][``0``]):``                ``if``(x[i][``1``]

## Javascript

 ``

Output:

`arc, for, Geeks,`

Time Complexity: O(nlogn)

Space Complexity: O(n)

My Personal Notes arrow_drop_up