Sort an array of Strings according frequency - GeeksforGeeks

19 May, 2021
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++
Python 3
Javascript
// C++ implementation to sort the// array of strings by its frequency #include <bits/stdc++.h>using namespace std; // Custom comparator function to// sort the string by its frequencybool 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 arrayvoid printArraystring(string str[], int n){    unordered_map<string, int> 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<pair<int, string> > 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 Codeint main(){    string arr[] = { "Geeks", "for", "Geeks",                     "for", "arc" };    int n = sizeof(arr) / sizeof(arr[0]);     // Function to perform sorting    printArraystring(arr, n);     return 0;}
# Python 3 implementation to sort the# array of strings by its frequency # Custom comparator function to# sort the string by its frequencydef 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]<x[j][1]):                    temp = x[j]                    x[j] = x[i]                    x[i] = temp                      # Function to sort the array of strings# by its frequency in the arraydef printArraystring(str,n):    m = {str[i]:0 for i in range(n)}     # Loop to store the frequency    # of a string in a hash-map    for i in range(n):        m[str[i]] += 1     # Iterator for the map    vec = []     # Loop to store the frequency and    # string in a vector    for key,value in m.items():        vec.append([value,key])     # Sort the string    # using custom comparator    srt(vec)     # Loop to print the sorted vector    for i in range(len(vec)):        if i==len(vec)-1:            print(vec[i][1])        else:            print(vec[i][1],end = ",")          # Driver Codeif __name__ == '__main__':    arr = ["Geeks", "for", "Geeks","for", "arc"]    n = len(arr)     # Function to perform sorting    printArraystring(arr, n) # This code is contributed by Surendra_Gangwar
<script>// Javascript program // Custom comparator function to// sort the string by its frequencyfunction cmp(x, y){       // Condition to check if the    // frequency of the string is less    if (x[0] < y[0]) {        return -1;    }       // Condition to check if the    // frequency of the string is greater    else if (x[0] > y[0]) {        return 1;    }       // Condition when frequency of    // the strings is equal    else if (x[0] === y[0]){           // Condition to check if the        // first string is lexicographically        // smaller than second string        if (x[1] < y[1]) {            return 1;        }        else {            return -1;        }    }}   // Function to sort the array of strings// by its frequency in the arrayfunction printArraystring(str, n){    var m = {};    for (i = 0; i < n; i++) {        m[str[i]] = 0;    }         // Loop to store the frequency    // of a string in a hash-map    for (i = 0; i < n; i++) {        m[str[i]]++;    }       // Iterator for the map    var vec = new Array(n);    for (i = 0; i < n; i++) {        vec[i] = [];    }       // Loop to store the frequency and    // string in a vector    var k = 0    for (var it in m) {        vec[k] = [m[it], it];        k += 1;    }       // Sort the string    // using custom comparator    vec.sort(cmp);       // Loop to print the sorted vector    for (var i = 0; i < k; i++) {        document.write(vec[i][1]+", ");    }} var arr = [ "Geeks", "for", "Geeks", "for", "arc" ];n = arr.length; // Function to perform sortingprintArraystring(arr, n);</script>
arc, for, Geeks,
 
SURENDRA_GANGWAR
spp____
shivanisinghss2110
Arrays
Sorting
Strings
Arrays
Strings
Sorting
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Count pairs with given sum
Chocolate Distribution Problem
Window Sliding Technique
Reversal algorithm for array rotation
Next Greater Element