Sort an array with swapping only with a special element is allowed
Last Updated :
15 Jun, 2022
Given an array of length n + 1, containing elements 1 through n and a space, Requires the use of a given swap (index i, index j) function to sort the array, You can only swap the gap and a number, in the end, put the gap at the end.
There will be a number 999 in the array as a gap or space.
Examples:
Input : arr = {1, 5, 4, 999, 3, 2}
Output : arr = {1, 2, 3, 4, 5, 999}
We need to sort only by moving
Input : arr = {1, 5, 4, 3, 2, 8, 7, 999, 6}
Output : arr = {1, 2, 3, 4, 5, 6, 7, 8, 999}
We follow a recursive approach to solve this problem. As we can only swap numbers with the space. First of all, we find the index of space. If the index is the start of the array, then move this space to the second last index by swapping with each number in its right.
If space is neither start of an array nor the last element of the array and the element before it is greater than the element next to space then do the following.
Step 1: Swap space and element next to space
In case of {3, 999, 2} make it {3, 2, 999}
Step 2 : Swap space and greater element
eg-convert {3, 2, 999} to {999, 2, 3}
Otherwise, elements next to the index are sorted and swap it with the previous element. Again call the sort function with the size of an array decreased by 1 and index of space – 1 as we will get one sorted element each time.
C++
#include <bits/stdc++.h>
using namespace std;
void sortRec( int arr[], int index, int k, int n)
{
if (k == 0) {
for ( int i = 1; i < n; i++)
cout << arr[i] << " " ;
cout << 999;
return ;
}
else if (k > 0 && index == 0) {
index = n - 2;
for ( int i = 1; i <= index; i++) {
arr[i - 1] = arr[i];
}
arr[index] = 999;
}
if (index - 1 >= 0 && index + 1 < n &&
arr[index - 1] > arr[index + 1]) {
swap(arr[index], arr[index + 1]);
swap(arr[index - 1], arr[index + 1]);
}
else
swap(arr[index], arr[index - 1]);
sortRec(arr, index - 1, k - 1, n);
}
void sort( int arr[], int n)
{
int index = -1;
for ( int i = 0; i < n; i++) {
if (arr[i] == 999) {
index = i;
break ;
}
}
if (index == -1)
return ;
sortRec(arr, index, n, n);
}
int main()
{
int arr[] = { 3, 2, 999, 1 };
int n = sizeof (arr) / sizeof (arr[0]);
sort(arr, n);
return 0;
}
|
Java
class GFG
{
static void sortRec( int arr[], int index, int k, int n)
{
if (k == 0 )
{
for ( int i = 1 ; i < n; i++)
System.out.print(arr[i] + " " );
System.out.println( 999 );
return ;
}
else if (k > 0 && index == 0 )
{
index = n - 2 ;
for ( int i = 1 ; i <= index; i++)
{
arr[i - 1 ] = arr[i];
}
arr[index] = 999 ;
}
if (index - 1 >= 0 && index + 1 < n &&
arr[index - 1 ] > arr[index + 1 ])
{
swap(arr,index, index + 1 );
swap(arr,index - 1 , index + 1 );
}
else
swap(arr,index, index - 1 );
sortRec(arr, index - 1 , k - 1 , n);
}
static int [] swap( int []arr, int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
return arr;
}
static void sort( int arr[], int n)
{
int index = - 1 ;
for ( int i = 0 ; i < n; i++)
{
if (arr[i] == 999 )
{
index = i;
break ;
}
}
if (index == - 1 )
return ;
sortRec(arr, index, n, n);
}
public static void main(String[] args)
{
int arr[] = { 3 , 2 , 999 , 1 };
int n = arr.length;
sort(arr, n);
}
}
|
Python3
def sortRec(arr, index, k, n):
if (k = = 0 ):
for i in range ( 1 ,n):
print (arr[i],end = " " )
print ( 999 ,end = "")
elif (k > 0 and index = = 0 ):
index = n - 2
for i in range ( 1 ,index + 1 ):
arr[i - 1 ] = arr[i]
arr[index] = 999
if (index - 1 > = 0 and index + 1 < n and arr[index - 1 ] > arr[index + 1 ]):
arr[index],arr[index + 1 ] = arr[index + 1 ],arr[index]
arr[index - 1 ],arr[index + 1 ] = arr[index + 1 ],arr[index - 1 ]
else :
if (index - 1 < 0 ):
return
arr[index],arr[index - 1 ] = arr[index - 1 ],arr[index]
sortRec(arr, index - 1 , k - 1 , n)
def sort(arr, n):
index = - 1
for i in range (n):
if (arr[i] = = 999 ):
index = i
break
if (index = = - 1 ):
return
sortRec(arr, index, n, n)
arr = [ 3 , 2 , 999 , 1 ]
n = len (arr)
sort(arr, n)
|
C#
using System;
class GFG
{
static void sortRec( int []arr, int index, int k, int n)
{
if (k == 0)
{
for ( int i = 1; i < n; i++)
Console.Write(arr[i] + " " );
Console.WriteLine(999);
return ;
}
else if (k > 0 && index == 0)
{
index = n - 2;
for ( int i = 1; i <= index; i++)
{
arr[i - 1] = arr[i];
}
arr[index] = 999;
}
if (index - 1 >= 0 && index + 1 < n &&
arr[index - 1] > arr[index + 1])
{
swap(arr,index, index + 1);
swap(arr,index - 1, index + 1);
}
else
swap(arr,index, index - 1);
sortRec(arr, index - 1, k - 1, n);
}
static int [] swap( int []arr, int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
return arr;
}
static void sort( int []arr, int n)
{
int index = -1;
for ( int i = 0; i < n; i++)
{
if (arr[i] == 999)
{
index = i;
break ;
}
}
if (index == -1)
return ;
sortRec(arr, index, n, n);
}
public static void Main(String[] args)
{
int []arr = { 3, 2, 999, 1 };
int n = arr.Length;
sort(arr, n);
}
}
|
Javascript
<script>
function sortRec(arr, index, k, n)
{
if (k == 0)
{
for (let i = 1; i < n; i++)
document.write(arr[i] + " " );
document.write(999);
return ;
}
else if (k > 0 && index == 0)
{
index = n - 2;
for (let i = 1; i <= index; i++)
{
arr[i - 1] = arr[i];
}
arr[index] = 999;
}
if (index - 1 >= 0 && index + 1 < n &&
arr[index - 1] > arr[index + 1])
{
swap(arr, index, index + 1);
swap(arr, index - 1, index + 1);
}
else
swap(arr,index, index - 1);
sortRec(arr, index - 1, k - 1, n);
}
function swap(arr, i, j)
{
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
return arr;
}
function sort(arr, n)
{
let index = -1;
for (let i = 0; i < n; i++)
{
if (arr[i] == 999)
{
index = i;
break ;
}
}
if (index == -1)
return ;
sortRec(arr, index, n, n);
}
let arr = [ 3, 2, 999, 1 ];
let n = arr.length;
sort(arr, n);
</script>
|
Output:
1 2 3 999
Time Complexity: O(n2)
Auxiliary Space: O(n)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...