Skip to content
Related Articles
Sort an Array of Version Numbers
• Difficulty Level : Medium
• Last Updated : 12 Aug, 2020

Given an array of strings arr[], consisting of N strings each representing dot separated numbers in the form of software versions.

Input: arr[] = {“1.1.2”, “0.9.1”, “1.1.0”}
Output: “0.9.1” “1.1.0” “1.1.2”

Input: arr[] = {“1.2”, “0.8.1”, “1.0”}
Output: “0.8.1” “1.0” “1.2”

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach: Follow the steps below to solve the problem:

• Create a function to compare two strings.
• Store strings into a vector.
• In order to compare two dot separated strings S1 and S2, iterate up to the length min(S1, S2) + 1 and compare each numerical parts of the string and sort accordingly.
• Repeat the above steps for each pair of string and sort the array accordingly.

Below is the implementation of above idea:

## C++

 `// C++ Program to implement``// the above approach``#include ``using` `namespace` `std;`` ` `// Compares two strings``int` `check(``const` `string& a, ``const` `string& b)``{`` ` `    ``int` `al = a.length();``    ``int` `bl = b.length();`` ` `    ``int` `i = 0, j = 0;``    ``while` `(i < al && j < bl) {``        ``if` `(a[i] == b[j]) {``            ``++i;``            ``++j;``        ``}``        ``else` `if` `(a[i] > b[j]) {``            ``return` `1;``        ``}``        ``else``            ``return` `-1;``    ``}`` ` `    ``if` `(i == al && j == bl)``        ``return` `0;``    ``if` `(i == al)``        ``return` `-1;``    ``return` `1;``}`` ` `// Function to split strings based on dots``vector getTokens(``const` `string& a)``{``    ``vector v;``    ``string s;`` ` `    ``// Stringstream is used here for``    ``// tokenising the string based``    ``// on "." delimiter which might``    ``// contain unequal number of "."[dots]``    ``stringstream ss(a);``    ``while` `(getline(ss, s, ``'.'``)) {``        ``v.push_back(s);``    ``}``    ``return` `v;``}`` ` `// Comparator to sort the array of strings``bool` `comp(``const` `string& a, ``const` `string& b)``{`` ` `    ``// Stores the numerical substrings``    ``vector va, vb;``    ``va = getTokens(a);``    ``vb = getTokens(b);`` ` `    ``// Iterate up to length of minimum``    ``// of the two strings``    ``for` `(``int` `i = 0; i < min(va.size(), vb.size());``         ``i++) {`` ` `        ``// Compare each numerical substring``        ``// of the two strings``        ``int` `countCheck = check(va[i], vb[i]);`` ` `        ``if` `(countCheck == -1)``            ``return` `true``;`` ` `        ``else` `if` `(countCheck == 1)``            ``return` `false``;``    ``}`` ` `    ``if` `(va.size() < vb.size())``        ``return` `true``;`` ` `    ``return` `false``;``}`` ` `// Driver Code``int` `main()``{`` ` `    ``vector s;``    ``s.push_back(``"1.1.0"``);``    ``s.push_back(``"1.2.1"``);``    ``s.push_back(``"0.9.1"``);``    ``s.push_back(``"1.3.4"``);``    ``s.push_back(``"1.1.2"``);``    ``s.push_back(``"1.1.2.2.3"``);``    ``s.push_back(``"9.3"``);`` ` `    ``// Sort the strings using comparator``    ``sort(s.begin(), s.end(), comp);`` ` `    ``// Display the sorted order``    ``for` `(``int` `i = 0; i < s.size(); i++) {``        ``cout << s[i] << endl;``    ``}``    ``cout << endl;``    ``return` `0;``}`
Output:
```0.9.1
1.1.0
1.1.2
1.1.2.2.3
1.2.1
1.3.4
9.3
```

Time Complexity: O(N*L*logN), where N is the total number of version strings, L is the maximum length among those strings.
Auxilairy Space: O(N * L)

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 Geeks Classes Live

My Personal Notes arrow_drop_up