Skip to content
Related Articles

Related Articles

Improve Article
Sort an array of Strings according frequency
  • Last Updated : 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++




// 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 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<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 Code
int 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




# 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]<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 array
def 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 Code
if __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

Javascript




<script>
// Javascript program
 
// Custom comparator function to
// sort the string by its frequency
function 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 array
function 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 sorting
printArraystring(arr, n);
</script>
Output: 
arc, for, Geeks,

 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with industry experts, please refer DSA Live Classes




My Personal Notes arrow_drop_up
Recommended Articles
Page :