Sort vector of Numeric Strings in ascending order

• Difficulty Level : Medium
• Last Updated : 18 Oct, 2021

Given a vector of numeric strings arr[], the task is to sort the given vector of numeric strings in ascending order.

Examples:

Input: arr[] = {“120000”, “2”, “33”}
Output: {“2”, “33”, “120000”}

Input: arr[] = {“120”, “2”, “3”}
Output: {“2”, “3”, “120”}

Approach: The sort() function in C++  STL is able to sort vector of strings if and only if it contains single numeric character for example, { ‘1’, ‘ ‘}  but to sort numeric vector of string with multiple character for example, {’12’, ’56’, ’14’ } one should write own comparator inside sort() function. The comparator function to sort in ascending order logic goes as:

Let’s build a comparator function considering the two cases given below:

• Case 1: If the length of the string is not the same then place a smaller length string in first place for example, {’12’, ‘2’}  place ‘2’ before ’12’ as ‘2’ is smaller than ’12’.
• Case 2: If length is the same then place the string which is numerically smaller for example, ‘1’, ‘2’ place ‘1’ before ‘2’.

Below is the C++ program to implement the above approach:

C++

 // C++ program for the above approach#include using namespace std; // Comparator Functionbool myCmp(string s1, string s2){     // If size of numeric strings    // are same the put lowest value    // first    if (s1.size() == s2.size()) {        return s1 < s2;    }     // If size is not same put the    // numeric string with less    // number of digits first    else {        return s1.size() < s2.size();    }} // Driver Codeint main(){    vector v        = { "12", "2", "10", "6", "4", "99", "12" };     // Calling sort function with    // custom comparator    sort(v.begin(), v.end(), myCmp);     // Print the vector values after    // sorting    for (auto it : v) {        cout << it << " ";    }     cout << "\n";}

Java

 // Java program for the above approachimport java.util.*;class GFG{ // Comparator Functionstatic List sort(List list){    Comparator cmp = (o1, o2) -> {        // If size of numeric Strings        // are same the put lowest value        // first        if (o1.length() == o2.length()) {            return Integer.valueOf(o1)-Integer.valueOf(o2);        }               // If size is not same put the        // numeric String with less        // number of digits first        else {            return o1.length()-o2.length();        }    };    Collections.sort(list, cmp);    return list;} // Driver Codepublic static void main(String[] args){    List v        = Arrays.asList( "12", "2", "10", "6", "4", "99", "12" );     // Calling sort function with    // custom comparator    v = sort(v);     // Print the vector values after    // sorting    for (String it : v) {        System.out.print(it+ " ");    } }} // This code is contributed by 29AjayKumar

Javascript



Output:
2 4 6 10 12 12 99

Time Complexity: O(N*log N)
Auxiliary Space: O(1)

My Personal Notes arrow_drop_up