Sort an Array of Strings in Lexicographical order
Given an array of strings arr[] of length N, the task is to sort the strings in Lexicographical order.
Examples:
Input: arr[] = {“batman”, “bat”, “apple”}
Output:
apple
bat
batman
Explanation:
The lexicographical order of string is “apple”, “bat”, “batman”
Input: arr[] = {“geeks”, “for”, “geeksforgeeks”}
Output:
for
geeks
geeksforgeeks
Approach 1:
The array can be sorted in increasing order by comparing ASCII values of the leftmost character that are different among the strings.
To sort the strings we can use the inbuilt sort() function. The function sorts the string in lexicographical order by default.
Below is the implementation for the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void Printlexiographically( int N, string arr[])
{
sort(arr, arr + N);
for ( int i = 0; i < N; i++) {
cout << arr[i] << '\n' ;
}
}
int main()
{
string arr[] = { "batman" , "bat" , "apple" };
int N = sizeof (arr) / sizeof (arr[0]);
Printlexiographically(N, arr);
return 0;
}
|
Java
import java.util.*;
import java.io.*;
class GFG
{
public static void Printlexiographically( int N,
String arr[])
{
Arrays.sort(arr);
for ( int i = 0 ; i < N; i++) {
System.out.println(arr[i]);
}
}
public static void main(String[] args)
{
String arr[] = { "batman" , "bat" , "apple" };
int N = arr.length;
Printlexiographically(N, arr);
}
}
|
Python3
def Printlexiographically(N, arr) :
arr.sort()
for i in range (N):
print (arr[i])
if __name__ = = "__main__" :
arr = [ "batman" , "bat" , "apple" ]
N = len (arr)
Printlexiographically(N, arr)
|
C#
using System;
public class GFG {
public static void Printlexiographically( int N,
string [] arr)
{
Array.Sort(arr);
for ( int i = 0; i < N; i++) {
Console.WriteLine(arr[i]);
}
}
static public void Main()
{
string [] arr = { "batman" , "bat" , "apple" };
int N = arr.Length;
Printlexiographically(N, arr);
}
}
|
Javascript
<script>
function Printlexiographically(N, arr)
{
arr.sort();
for (let i = 0; i < N; i++) {
document.write(arr[i] + "<br/>" );
}
}
let arr = [ "batman" , "bat" , "apple" ];
let N = arr.length;
Printlexiographically(N, arr);
</script>
|
Time Complexity: O(N * logN * M), where M is the average length of the strings
Auxiliary Space: O(1)
Approach 2: Using Sorting
Idea/Intuition
The idea is to sort the strings lexicographically using the sorting algorithms. The sorting algorithms basically works by comparing pairs of elements and sorting them based on the comparison result.
Algorithm
- Create an array of strings, say arr[]
- Sort the array using any sorting algorithm, say mergeSort()
mergeSort(arr[], 0, n-1)
- Steps to implement mergeSort():
Step 1: If it is only one element in the array then return.
Step 2: Else divide the array into two halves say left[] and right[].
Step 3: Sort the left array using mergeSort():
mergeSort(left[], 0, mid-1)
Step 4: Sort the right array using mergeSort():
mergeSort(right[], 0, mid)
Step 5: Merge the sorted left and right arrays:
merge(left[], right[], arr[])
Step 6: Return the sorted array.
Implementation
Below is the implementation for the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void merge(string arr[], int l, int m, int r)
{
int i, j, k;
int n1 = m - l + 1;
int n2 = r - m;
string L[n1], R[n2];
for (i = 0; i < n1; i++)
L[i] = arr[l + i];
for (j = 0; j < n2; j++)
R[j] = arr[m + 1+ j];
i = 0;
j = 0;
k = l;
while (i < n1 && j < n2)
{
if (L[i] <= R[j])
{
arr[k] = L[i];
i++;
}
else
{
arr[k] = R[j];
j++;
}
k++;
}
while (i < n1)
{
arr[k] = L[i];
i++;
k++;
}
while (j < n2)
{
arr[k] = R[j];
j++;
k++;
}
}
void mergeSort(string arr[], int l, int r)
{
if (l < r)
{
int m = l+(r-l)/2;
mergeSort(arr, l, m);
mergeSort(arr, m+1, r);
merge(arr, l, m, r);
}
}
void printArray(string A[], int size)
{
int i;
for (i=0; i < size; i++)
cout << A[i] << " " ;
cout << endl;
}
int main()
{
string arr[] = { "batman" , "bat" , "apple" };
int arr_size = sizeof (arr)/ sizeof (arr[0]);
cout << "Given array is \n" ;
printArray(arr, arr_size);
mergeSort(arr, 0, arr_size - 1);
cout << "\nSorted array is \n" ;
printArray(arr, arr_size);
return 0;
}
|
Java
import java.util.*;
class GFG {
static void merge(String arr[], int l, int m, int r)
{
int i, j, k;
int n1 = m - l + 1 ;
int n2 = r - m;
String L[] = new String[n1], R[] = new String[n2];
for (i = 0 ; i < n1; i++)
L[i] = arr[l + i];
for (j = 0 ; j < n2; j++)
R[j] = arr[m + 1 + j];
i = 0 ;
j = 0 ;
k = l;
while (i < n1 && j < n2)
{
if (L[i].compareTo(R[j])<= 0 )
{
arr[k] = L[i];
i++;
}
else
{
arr[k] = R[j];
j++;
}
k++;
}
while (i < n1)
{
arr[k] = L[i];
i++;
k++;
}
while (j < n2)
{
arr[k] = R[j];
j++;
k++;
}
}
static void mergeSort(String arr[], int l, int r)
{
if (l < r)
{
int m = l+(r-l)/ 2 ;
mergeSort(arr, l, m);
mergeSort(arr, m+ 1 , r);
merge(arr, l, m, r);
}
}
static void printArray(String A[], int size)
{
int i;
for (i= 0 ; i < size; i++)
System.out.print(A[i] + " " );
System.out.println();
}
public static void main (String[] args) {
String arr[] = { "batman" , "bat" , "apple" };
int arr_size = arr.length;
System.out.println( "Given array is" );
printArray(arr, arr_size);
mergeSort(arr, 0 , arr_size - 1 );
System.out.println( "\nSorted array is" );
printArray(arr, arr_size);
}
}
|
Python3
def merge( arr, l, m, r) :
n1 = m - l + 1 ;
n2 = r - m;
L = [ 0 ] * (n1);
R = [ 0 ] * (n2);
for i in range ( 0 , n1):
L[i] = arr[l + i];
for j in range ( 0 , n2):
R[j] = arr[m + 1 + j];
i = 0 ;
j = 0 ;
k = l;
while (i < n1 and j < n2) :
if (L[i] < = R[j]) :
arr[k] = L[i];
i + = 1 ;
else :
arr[k] = R[j];
j + = 1 ;
k + = 1 ;
while (i < n1):
arr[k] = L[i];
i + = 1 ;
k + = 1 ;
while (j < n2) :
arr[k] = R[j];
j + = 1 ;
k + = 1 ;
def mergeSort(arr, l, r):
if (l < r) :
m = l + (r - l) / / 2 ;
mergeSort(arr, l, m);
mergeSort(arr, m + 1 , r);
merge(arr, l, m, r);
def printArray( A, size) :
for i in range ( 0 ,size):
print ( "%s" % A[i],end = " " )
arr = [ "batman" , "bat" , "apple" ];
arr_size = len (arr);
print ( "Given array is " );
printArray(arr, arr_size);
mergeSort(arr, 0 , arr_size - 1 );
print ( "\nSorted array is" );
printArray(arr, arr_size);
|
C#
using System;
using System.Linq;
class GFG
{
static void Merge( string [] arr, int l, int m, int r)
{
int i, j, k;
int n1 = m - l + 1;
int n2 = r - m;
string [] L = new string [n1];
string [] R = new string [n2];
for (i = 0; i < n1; i++)
L[i] = arr[l + i];
for (j = 0; j < n2; j++)
R[j] = arr[m + 1 + j];
i = 0;
j = 0;
k = l;
while (i < n1 && j < n2)
{
if (String.Compare(L[i], R[j]) <= 0)
{
arr[k] = L[i];
i++;
}
else
{
arr[k] = R[j];
j++;
}
k++;
}
while (i < n1)
{
arr[k] = L[i];
i++;
k++;
}
while (j < n2)
{
arr[k] = R[j];
j++;
k++;
}
}
static void MergeSort( string [] arr, int l, int r)
{
if (l < r)
{
int m = l + (r - l) / 2;
MergeSort(arr, l, m);
MergeSort(arr, m + 1, r);
Merge(arr, l, m, r);
}
}
static void PrintArray( string [] A, int size)
{
for ( int i = 0; i < size; i++)
Console.Write(A[i] + " " );
Console.WriteLine();
}
public static void Main( string [] args)
{
string [] arr = { "batman" , "bat" , "apple" };
int arr_size = arr.Length;
Console.WriteLine( "Given array is" );
PrintArray(arr, arr_size);
MergeSort(arr, 0, arr_size - 1);
Console.WriteLine( "\nSorted array is" );
PrintArray(arr, arr_size);
}
}
|
Javascript
function merge(arr, l, m, r)
{
var n1 = m - l + 1;
var n2 = r - m;
var L = new Array(n1);
var R = new Array(n2);
for ( var i = 0; i < n1; i++)
L[i] = arr[l + i];
for ( var j = 0; j < n2; j++)
R[j] = arr[m + 1 + j];
var i = 0;
var j = 0;
var k = l;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
}
else {
arr[k] = R[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
function mergeSort(arr,l, r){
if (l>=r){
return ;
}
var m =l+ parseInt((r-l)/2);
mergeSort(arr,l,m);
mergeSort(arr,m+1,r);
merge(arr,l,m,r);
}
function printArray( A, size)
{
for ( var i = 0; i < size; i++)
document.write( A[i] + " " );
}
let arr = [ "batman" , "bat" , "apple" ];
var arr_size = arr.length;
document.write( "Given array is" );
document.write( "<br>" );
printArray(arr, arr_size);
document.write( "<br>" );
mergeSort(arr, 0, arr_size - 1);
document.write( "Sorted array is" );
document.write( "<br>" );
printArray(arr, arr_size);
|
Output
Given array is
batman bat apple
Sorted array is
apple bat batman
Time complexity: O(n * log n * m) (where m is average length of strings)
Auxiliary Space: O(n)
Last Updated :
20 Feb, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...