# Sort an array of Roman Numerals in ascending order

Given an array arr[] of N Roman Numerals, the task is to sort these Roman Numerals in ascending order.

Examples:

Input: arr[] = { “MCMIV”, “MIV”, “MCM”, “MMIV” }
Output: MIV MCM MCMIV MMIV
Explanation:
The roman numerals in their corresponding decimal system are:
MIV: 1004
MCM: 1900
MCMIV: 1904
MMIV: 2004

Input: arr = { “MV”, “MIV”, “MCM”, “MM” }
Output: MIV MV MCM MM
Explanation:
The roman numerals in their corresponding decimal system are:
MIV 1004
MV 1005
MCM 1900
MM 2000

Approach: The idea to solve this problem is to store each element with its Roman to Integer value in a vector pair and then sort all the elements of the vector according to Roman to Integer value stored.

• Iterate the given roman number.
• Convert the roman number to the decimal and store them as a pair in a vector.
• Sort the vector based on the decimal numbers stored in them.
• Finally, print the roman numbers in the sorted order.

Below is the implementation of the above approach:

## C++

 `// C++ program to sort an array of` `// Roman Numerals in ascending order`   `#include ` `using` `namespace` `std;`   `// Function to return the value` `// of a Roman symbol` `int` `value(``char` `r)` `{` `    ``// I in roman is equal to` `    ``// 1 in decimal` `    ``if` `(r == ``'I'``)` `        ``return` `1;`   `    ``// V in roman is equal to` `    ``// 5 in decimal` `    ``if` `(r == ``'V'``)` `        ``return` `5;`   `    ``// X in roman is equal to` `    ``// 10 in decimal` `    ``if` `(r == ``'X'``)` `        ``return` `10;`   `    ``// L in roman is equal to` `    ``// 50 in decimal` `    ``if` `(r == ``'L'``)` `        ``return` `50;`   `    ``// C in roman is equal to` `    ``// 100 in decimal` `    ``if` `(r == ``'C'``)` `        ``return` `100;`   `    ``// D in roman is equal to` `    ``// 500 in decimal` `    ``if` `(r == ``'D'``)` `        ``return` `500;`   `    ``// M in roman is equal to` `    ``// 1000 in decimal` `    ``if` `(r == ``'M'``)` `        ``return` `1000;`   `    ``return` `-1;` `}`   `// Function to return the decimal value` `// of a roman numaral` `int` `romanToDecimal(string& str)` `{` `    ``// Initialize result` `    ``int` `res = 0;`   `    ``// Traverse given input` `    ``for` `(``int` `i = 0; i < str.length(); i++) {`   `        ``// Getting value of symbol s[i]` `        ``int` `s1 = value(str[i]);`   `        ``if` `(i + 1 < str.length()) {`   `            ``// Getting value of symbol s[i+1]` `            ``int` `s2 = value(str[i + 1]);`   `            ``// Comparing both values` `            ``if` `(s1 >= s2) {`   `                ``// Value of current symbol` `                ``// is >= the next symbol` `                ``res = res + s1;` `            ``}` `            ``else` `{`   `                ``// Value of current symbol` `                ``// is < the next symbol` `                ``res = res + s2 - s1;` `                ``i++;` `            ``}` `        ``}` `        ``else` `{` `            ``res = res + s1;` `        ``}` `    ``}` `    ``return` `res;` `}`   `// Function to sort the array according to` `// the increasing order` `void` `sortArr(string arr[], ``int` `n)` `{` `    ``// Vector to store the roman to integer` `    ``// with respective elements` `    ``vector > vp;`   `    ``// Inserting roman to integer` `    ``// with respective elements in vector pair` `    ``for` `(``int` `i = 0; i < n; i++) {` `        ``vp.push_back(make_pair(` `            ``romanToDecimal(` `                ``arr[i]),` `            ``arr[i]));` `    ``}`   `    ``// Sort the vector, this will sort the pair` `    ``// according to the increasing order.` `    ``sort(vp.begin(), vp.end());`   `    ``// Print the sorted vector content` `    ``for` `(``int` `i = 0; i < vp.size(); i++)` `        ``cout << vp[i].second << ``" "` `             ``<< vp[i].first << ``"\n"``;` `}`   `// Driver code` `int` `main()` `{` `    ``string arr[] = { ``"MCMIV"``, ``"MIV"``,` `                     ``"MCM"``, ``"MMIV"` `};` `    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr);`   `    ``sortArr(arr, n);`   `    ``return` `0;` `}`

## Java

 `// Java program to sort an array of` `// Roman Numerals in ascending order` `import` `java.io.*;` `import` `java.util.*;`   `// User defined Pair class` `class` `Pair ` `{` `    ``int` `x;` `    ``String y;` `    `  `    ``public` `Pair(``int` `a, String b)` `    ``{` `        ``this``.x = a;` `        ``this``.y = b;` `    ``}` `}`   `// Class to define user defined conparator` `class` `Compare` `{` `    ``static` `void` `compare(ArrayList vp)` `    ``{` `        `  `        ``// Comparator to sort the pair according ` `        ``// to first element` `        ``Collections.sort(vp, ``new` `Comparator()` `        ``{` `            ``@Override` `public` `int` `compare(Pair p1, Pair p2)` `            ``{` `                ``return` `p1.x - p2.x;` `            ``}` `        ``});` `    ``}` `}`   `class` `GFG{`   `// Function to return the value` `// of a Roman symbol` `static` `int` `value(``char` `r)` `{` `    `  `    ``// I in roman is equal to` `    ``// 1 in decimal` `    ``if` `(r == ``'I'``)` `        ``return` `1``;`   `    ``// V in roman is equal to` `    ``// 5 in decimal` `    ``if` `(r == ``'V'``)` `        ``return` `5``;`   `    ``// X in roman is equal to` `    ``// 10 in decimal` `    ``if` `(r == ``'X'``)` `        ``return` `10``;`   `    ``// L in roman is equal to` `    ``// 50 in decimal` `    ``if` `(r == ``'L'``)` `        ``return` `50``;`   `    ``// C in roman is equal to` `    ``// 100 in decimal` `    ``if` `(r == ``'C'``)` `        ``return` `100``;`   `    ``// D in roman is equal to` `    ``// 500 in decimal` `    ``if` `(r == ``'D'``)` `        ``return` `500``;`   `    ``// M in roman is equal to` `    ``// 1000 in decimal` `    ``if` `(r == ``'M'``)` `        ``return` `1000``;`   `    ``return` `-``1``;` `}`   `// Function to return the decimal value` `// of a roman numaral` `static` `int` `romanToDecimal(String str)` `{` `    `  `    ``// Initialize result` `    ``int` `res = ``0``;`   `    ``// Traverse given input` `    ``for``(``int` `i = ``0``; i < str.length(); i++)` `    ``{` `        `  `        ``// Getting value of symbol s[i]` `        ``int` `s1 = value(str.charAt(i));`   `        ``if` `(i + ``1` `< str.length()) ` `        ``{` `            `  `            ``// Getting value of symbol s[i+1]` `            ``int` `s2 = value(str.charAt(i + ``1``));`   `            ``// Comparing both values` `            ``if` `(s1 >= s2) ` `            ``{` `                `  `                ``// Value of current symbol` `                ``// is >= the next symbol` `                ``res = res + s1;` `            ``}` `            ``else` `            ``{` `                `  `                ``// Value of current symbol` `                ``// is < the next symbol` `                ``res = res + s2 - s1;` `                ``i++;` `            ``}` `        ``}` `        ``else` `        ``{` `            ``res = res + s1;` `        ``}` `    ``}` `    ``return` `res;` `}`   `// Function to sort the array according to` `// the increasing order` `static` `void` `sortArr(String[] arr, ``int` `n)` `{` `    `  `    ``// Vector to store the roman to integer` `    ``// with respective elements` `    ``ArrayList vp = ``new` `ArrayList();`   `    ``// Inserting roman to integer` `    ``// with respective elements in vector pair` `    ``for``(``int` `i = ``0``; i < n; i++)` `    ``{` `        ``vp.add(``new` `Pair(romanToDecimal(arr[i]),` `                                       ``arr[i]));` `    ``}`   `    ``// Sort the vector, this will sort the pair` `    ``// according to the increasing order.` `    ``Compare obj = ``new` `Compare();` `    ``obj.compare(vp);`   `    ``// Print the sorted vector content` `    ``for``(``int` `i = ``0``; i < vp.size(); i++)` `        ``System.out.println(vp.get(i).y + ``" "` `+ ` `                           ``vp.get(i).x + ``"\n"``);` `}`   `// Driver Code` `public` `static` `void` `main(String[] args)` `{` `    ``String arr[] = { ``"MCMIV"``, ``"MIV"``, ``"MCM"``, ``"MMIV"` `};` `    ``int` `n = arr.length;`   `    ``sortArr(arr, n);` `}` `}`   `// This code is contributed by akhilsaini`

## Python3

 `# Python3 program to sort an array of` `# Roman Numerals in ascending order`   `# Function to return the value` `# of a Roman symbol` `def` `value(r):`   `    ``# I in roman is equal to` `    ``# 1 in decimal` `    ``if` `(r ``=``=` `'I'``):` `        ``return` `1`   `    ``# V in roman is equal to` `    ``# 5 in decimal` `    ``if` `(r ``=``=` `'V'``):` `        ``return` `5`   `    ``# X in roman is equal to` `    ``# 10 in decimal` `    ``if` `(r ``=``=` `'X'``):` `        ``return` `10` `        `  `    ``# L in roman is equal to` `    ``# 50 in decimal` `    ``if` `(r ``=``=` `'L'``):` `        ``return` `50`   `    ``# C in roman is equal to` `    ``# 100 in decimal` `    ``if` `(r ``=``=` `'C'``):` `        ``return` `100`   `    ``# D in roman is equal to` `    ``# 500 in decimal` `    ``if` `(r ``=``=` `'D'``):` `        ``return` `500`   `    ``# M in roman is equal to` `    ``# 1000 in decimal` `    ``if` `(r ``=``=` `'M'``):` `        ``return` `1000`   `    ``return` `-``1`   `# Function to return the decimal value` `# of a roman numaral` `def` `romanToDecimal(st):`   `    ``# Initialize result` `    ``res ``=` `0`   `    ``# Traverse given input` `    ``i ``=` `0` `    ``while` `i < ``len``(st):`   `        ``# Getting value of symbol s[i]` `        ``s1 ``=` `value(st[i])`   `        ``if` `(i ``+` `1` `< ``len``(st)):`   `            ``# Getting value of symbol s[i+1]` `            ``s2 ``=` `value(st[i ``+` `1``])`   `            ``# Comparing both values` `            ``if` `(s1 >``=` `s2):`   `                ``# Value of current symbol` `                ``# is >= the next symbol` `                ``res ``=` `res ``+` `s1` `            `  `            ``else` `:`   `                ``# Value of current symbol` `                ``# is < the next symbol` `                ``res ``=` `res ``+` `s2 ``-` `s1` `                ``i ``+``=` `1` `        `  `        ``else` `:` `            ``res ``=` `res ``+` `s1` `            `  `        ``i ``+``=` `1` `    `  `    ``return` `res`   `# Function to sort the array according to` `# the increasing order` `def` `sortArr(arr, n):`   `    ``# Vector to store the roman to integer` `    ``# with respective elements` `    ``vp ``=` `{}`   `    ``# Inserting roman to integer` `    ``# with respective elements in vector pair` `    ``for` `i ``in` `range``(n):` `        ``p ``=` `romanToDecimal(arr[i]) ` `        ``vp[p] ``=` `arr[i]`   `    ``# Sort the vector, this will sort the pair` `    ``# according to the increasing order.` `    ``for` `i ``in` `sorted``(vp):` `        ``print``(vp[i], i)`   `# Driver code` `if` `__name__ ``=``=` `"__main__"``:` `    `  `    ``arr ``=` `[ ``"MCMIV"``, ``"MIV"``,` `            ``"MCM"``, ``"MMIV"` `]` `    ``n ``=` `len``(arr)`   `    ``sortArr(arr, n)`   `# This code is contributed by chitranayal`

## C#

 `// C# program to sort an array of` `// Roman Numerals in ascending order` `using` `System;` `using` `System.Collections;` `using` `System.Collections.Generic;`   `class` `ABC : IComparer ` `{ ` `    ``public` `int` `Compare(Pair p1, Pair p2) ` `    ``{ ` `        ``if` `(p1.x == 0 || p2.x == 0) ` `        ``{ ` `            ``return` `0; ` `        ``} ` `          `  `        ``// CompareTo() method ` `        ``return` `p1.x.CompareTo(p2.x); ` `    ``} ` `} `   `// User defined Pair class` `public` `class` `Pair ` `{` `    ``public` `int` `x;` `    ``public` `string` `y;` `    `  `    ``public` `Pair(``int` `a, ``string` `b)` `    ``{` `        ``this``.x = a;` `        ``this``.y = b;` `    ``}` `}`   `class` `GFG{` `    `  `// Function to return the value` `// of a Roman symbol` `static` `int` `value(``char` `r)` `{` `    `  `    ``// I in roman is equal to` `    ``// 1 in decimal` `    ``if` `(r == ``'I'``)` `        ``return` `1;`   `    ``// V in roman is equal to` `    ``// 5 in decimal` `    ``if` `(r == ``'V'``)` `        ``return` `5;`   `    ``// X in roman is equal to` `    ``// 10 in decimal` `    ``if` `(r == ``'X'``)` `        ``return` `10;`   `    ``// L in roman is equal to` `    ``// 50 in decimal` `    ``if` `(r == ``'L'``)` `        ``return` `50;`   `    ``// C in roman is equal to` `    ``// 100 in decimal` `    ``if` `(r == ``'C'``)` `        ``return` `100;`   `    ``// D in roman is equal to` `    ``// 500 in decimal` `    ``if` `(r == ``'D'``)` `        ``return` `500;`   `    ``// M in roman is equal to` `    ``// 1000 in decimal` `    ``if` `(r == ``'M'``)` `        ``return` `1000;`   `    ``return` `-1;` `}`   `// Function to return the decimal value` `// of a roman numaral` `static` `int` `romanToDecimal(``string` `str)` `{` `    `  `    ``// Initialize result` `    ``int` `res = 0;`   `    ``// Traverse given input` `    ``for``(``int` `i = 0; i < str.Length; i++)` `    ``{` `        `  `        ``// Getting value of symbol s[i]` `        ``int` `s1 = value(str[i]);`   `        ``if` `(i + 1 < str.Length)` `        ``{` `            `  `            ``// Getting value of symbol s[i+1]` `            ``int` `s2 = value(str[i + 1]);`   `            ``// Comparing both values` `            ``if` `(s1 >= s2)` `            ``{` `                `  `                ``// Value of current symbol` `                ``// is >= the next symbol` `                ``res = res + s1;` `            ``}` `            ``else` `            ``{`   `                ``// Value of current symbol` `                ``// is < the next symbol` `                ``res = res + s2 - s1;` `                ``i++;` `            ``}` `        ``}` `        ``else` `        ``{` `            ``res = res + s1;` `        ``}` `    ``}` `    ``return` `res;` `}`   `// Function to sort the array according to` `// the increasing order` `static` `void` `sortArr(String[] arr, ``int` `n)` `{` `    `  `    ``// Vector to store the roman to integer` `    ``// with respective elements` `    ``List vp = ``new` `List();`   `    ``// Inserting roman to integer` `    ``// with respective elements in vector pair` `    ``for``(``int` `i = 0; i < n; i++)` `    ``{` `        ``vp.Add(``new` `Pair(romanToDecimal(arr[i]),` `                                       ``arr[i]));` `    ``}`   `    ``// Sort the vector, this will sort the pair` `    ``// according to the increasing order.` `    ``ABC gg = ``new` `ABC();` `    ``vp.Sort(gg);`   `    ``// Print the sorted vector content` `    ``for``(``int` `i = 0; i < vp.Count; i++)` `        ``Console.WriteLine(vp[i].y + ``" "` `+ ` `                          ``vp[i].x + ``"\n"``);` `}`   `// Driver Code` `static` `public` `void` `Main ()` `{` `     ``string``[] arr = { ``"MCMIV"``, ``"MIV"``, ``"MCM"``, ``"MMIV"` `};` `    ``int` `n = arr.Length;`   `    ``sortArr(arr, n);` `}` `}`   `// This code is contributed by akhilsaini`

Output:

```MIV 1004
MCM 1900
MCMIV 1904
MMIV 2004

```

Time Complexity: O(N * log(N)), where N is the number of elements in the array.

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.

My Personal Notes arrow_drop_up Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Improved By : chitranayal, akhilsaini