Given an almost sorted array where only two elements are swapped, how to sort the array efficiently?
Examples :
Input: arr[] = {10, 20, 60, 40, 50, 30}
// 30 and 60 are swapped
Output: arr[] = {10, 20, 30, 40, 50, 60}
Input: arr[] = {10, 20, 40, 30, 50, 60}
// 30 and 40 are swapped
Output: arr[] = {10, 20, 30, 40, 50, 60}
Input: arr[] = {1, 5, 3}
// 3 and 5 are swapped
Output: arr[] = {1, 3, 5}
Expected time complexity is O(n) and only one swap operation to fix the array.
The idea is to traverse from rightmost side and find the first out of order element (element which is smaller than previous element). Once first element is found, find the other out of order element by traversing the array toward left side.
Below is implementation of above idea.
C++
#include<iostream>
#include<algorithm>
using namespace std;
void sortByOneSwap( int arr[], int n)
{
for ( int i = n-1; i > 0; i--)
{
if (arr[i] < arr[i-1])
{
int j = i-1;
while (j>=0 && arr[i] < arr[j])
j--;
swap(arr[i], arr[j+1]);
break ;
}
}
}
void printArray( int arr[], int n)
{
int i;
for (i=0; i < n; i++)
cout << arr[i] << " " ;
cout << endl;
}
int main()
{
int arr[] = {10, 30, 20, 40, 50, 60, 70};
int n = sizeof (arr)/ sizeof (arr[0]);
cout << "Given array is \n" ;
printArray(arr, n);
sortByOneSwap(arr, n);
cout << "Sorted array is \n" ;
printArray(arr, n);
return 0;
}
|
Java
import java.io.*;
class GFG
{
static void sortByOneSwap( int arr[],
int n)
{
for ( int i = n - 1 ; i > 0 ; i--)
{
if (arr[i] < arr[i - 1 ])
{
int j = i - 1 ;
while (j >= 0 && arr[i] < arr[j])
j--;
int temp = arr[i];
arr[i] = arr[j + 1 ];
arr[j + 1 ] = temp;
break ;
}
}
}
static void printArray( int arr[], int n)
{
int i;
for (i = 0 ; i < n; i++)
System.out.print(arr[i] + " " );
System.out.println();
}
public static void main(String[] args)
{
int arr[] = { 10 , 30 , 20 ,
40 , 50 , 60 , 70 };
int n = arr.length;
System.out.println( "Given array is " );
printArray(arr, n);
sortByOneSwap(arr, n);
System.out.println( "Sorted array is " );
printArray(arr, n);
}
}
|
Python3
def sortByOneSwap(arr, n):
for i in range (n - 1 , 0 , - 1 ):
if (arr[i] < arr[i - 1 ]):
j = i - 1 ;
while (j > = 0 and arr[i] < arr[j]):
j - = 1 ;
temp = arr[i];
arr[i] = arr[j + 1 ];
arr[j + 1 ] = temp;
break ;
def printArray(arr, n):
for i in range (n):
print (arr[i], end = " " );
print ();
if __name__ = = '__main__' :
arr = [ 10 , 30 , 20 , 40 , 50 , 60 , 70 ];
n = len (arr);
print ( "Given array is " );
printArray(arr, n);
sortByOneSwap(arr, n);
print ( "Sorted array is " );
printArray(arr, n);
|
C#
using System;
class GFG
{
static void sortByOneSwap( int []arr,
int n)
{
for ( int i = n - 1; i > 0; i--)
{
if (arr[i] < arr[i - 1])
{
int j = i - 1;
while (j >= 0 && arr[i] < arr[j])
j--;
int temp = arr[i];
arr[i] = arr[j + 1];
arr[j + 1] = temp;
break ;
}
}
}
static void printArray( int []arr, int n)
{
int i;
for (i = 0; i < n; i++)
Console.Write(arr[i] + " " );
Console.WriteLine();
}
public static void Main()
{
int []arr = {10, 30, 20,
40, 50, 60, 70};
int n = arr.Length;
Console.WriteLine( "Given array is " );
printArray(arr, n);
sortByOneSwap(arr, n);
Console.WriteLine( "Sorted array is " );
printArray(arr, n);
}
}
|
PHP
<?php
function sortByOneSwap(& $arr , $n )
{
for ( $i = $n - 1; $i > 0; $i --)
{
if ( $arr [ $i ] < $arr [ $i - 1])
{
$j = $i - 1;
while ( $j >= 0 && $arr [ $i ] < $arr [ $j ])
$j --;
$temp = $arr [ $i ];
$arr [ $i ] = $arr [ $j + 1];
$arr [ $j + 1] = $temp ;
break ;
}
}
}
function printArray(& $arr , $n )
{
for ( $i = 0; $i < $n ; $i ++)
echo $arr [ $i ] . " " ;
echo "\n" ;
}
$arr = array (10, 30, 20,
40, 50, 60, 70);
$n = sizeof( $arr );
echo "Given array is " . "\n" ;
printArray( $arr , $n );
sortByOneSwap( $arr , $n );
echo "Sorted array is " . "\n" ;
printArray( $arr , $n );
|
Javascript
<script>
function sortByOneSwap(arr, n)
{
for (let i = n - 1; i > 0; i--)
{
if (arr[i] < arr[i - 1])
{
let j = i - 1;
while (j >= 0 && arr[i] < arr[j])
j--;
let temp = arr[i];
arr[i] = arr[j + 1];
arr[j + 1] = temp;
break ;
}
}
}
function printArray(arr, n)
{
let i;
for (i = 0; i < n; i++)
document.write(arr[i] + " " );
document.write( "</br>" );
}
let arr = [10, 30, 20, 40, 50, 60, 70];
let n = arr.length;
document.write( "Given array is " + "</br>" );
printArray(arr, n);
sortByOneSwap(arr, n);
document.write( "Sorted array is " + "</br>" );
printArray(arr, n);
</script>
|
Output :
Given array is
10 30 20 40 50 60 70
Sorted array is
10 20 30 40 50 60 70
Time Complexity: O(N), as we are using a loop to traverse the array.
Auxiliary Space: O(1), as we are not using extra space.
The above program works in O(n) time and swaps only one element.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above