Find if array can be sorted by swaps limited to multiples of k
Last Updated :
25 May, 2021
Given an array and a number k, the task is to check if the given array can be sorted or not with limited swap operations. We can swap arr[i] only with arr[i] or arr[i + k] or arr[i + 2*k] or arr[i + 3*k] and so on. In general an element at index i can be swapped with elements at indexes i + j*k where j = 0, 1, 2, 3, …
Note : Any number of swaps can be performed on the array.
Examples:
Input: arr[8] = [1, 5, 6, 9, 2, 3, 5, 9], k = 3
Output: Possible to sort
Explanation: 1 5 6 9 2 3 5 9
0 1 2 3 4 5 6 7 here k is 3
0 can swap with 0 + 3 = (3) element
1 can swap with 1 + 3 = (4) element
2 can swap with 2 + 3 = (5) element
3 can swap with 3 + 3 = (6) element
4 can swap with 4 + 3 = (7) element
we can see that element at index 0, 3, 6 can swap with each other
we can see that element at index 1, 4, 7 can swap with each other
we can see that element at index 2, 5 can swap with each other
element 0 can never swap with 7, 1, 4, 2, 5
swap element at index (1, 4) 1 2 6 9 5 3 5 9
because sortarr[1] = 2
swap element at index (2, 5) 1 2 3 9 5 6 5 9
because sortarr[2] = 3
swap element at index (3, 6) 1 2 3 5 5 6 9 9
because sortarr[3] = 5
by swapping in this case we are able to reach 1 2 3 5 5 6 9 9
Input :arr=[1, 4, 2, 3], k = 2
Output : Not possible to sort
Explanation: 1 4 2 3
0 1 2 3 where k is 2
0 can swap with 0 + 2 = (2) element.
1 can swap with 1 + 2 = (3) element.
we can see that element at index 0, 2 can swap with each other.
we can see that element at index 1, 3 can swap with each other.
no need to swap element at index (0, 2) 1 4 2 3
0 1 2 3
at index 1 of sorted array is 2
2 is not present in 1 + j * 2, where j = {0, 1}
so since 2 can never come at index 1 of array,
array can not be sort.
array is not sorted after swapping.
Input :arr[] = [1, 4, 2, 3], k = 1
Output : Possible to sort
Explanation: 1 4 2 3
0 1 2 3 where k is 1
when k is 1 it is always possible to sort
because swap take place between adjacent element.
Approach:
1) Create sortArr[] as sorted version of given arr.
2) Compare this array with sorted array.
3) Iterate over for loop, to compare index i.
4) Now index i, element is compared with
index = i + j * k
where j = 0, 1, 2…..
5) if for particular i element of sortArr[i] match with sequence arr[index], then flag is 1 and
swap arr[i], arr[index]
6) if no swap then flag is 0 and that means no element is found in sequence
7) if flag is 0 break for loop and print Not possible
8) else print Possible
C++14
#include <bits/stdc++.h>
using namespace std;
void CheckSort(vector< int > arr, int k, int n){
vector< int > sortarr(arr.begin(),arr.end());
sort(sortarr.begin(),sortarr.end());
if (k == 1)
printf ( "yes" );
else
{
int flag = 0;
for ( int i = 0; i < n; i++)
{
flag = 0;
for ( int j = i; j < n; j += k)
{
if (sortarr[i] == arr[j]){
swap(arr[i], arr[j]);
flag = 1;
break ;
}
if (j + k >= n)
break ;
}
if (flag == 0)
break ;
}
if (flag == 0)
printf ( "Not possible to sort" );
else
printf ( "Possible to sort" );
}
}
int main()
{
int k = 3;
vector< int > arr ={1, 5, 6, 9, 2, 3, 5, 9};
int n =arr.size();
CheckSort(arr, k, n);
return 0;
}
|
Java
import java.util.*;
class GFG{
public static void CheckSort(Vector<Integer> arr,
int k, int n)
{
Vector<Integer> sortarr = new Vector<Integer>();
for ( int i = 0 ; i < arr.size(); i++)
{
sortarr.add(arr.get(i));
}
Collections.sort(sortarr);
if (k == 1 )
System.out.println( "yes" );
else
{
int flag = 0 ;
for ( int i = 0 ; i < n; i++)
{
flag = 0 ;
for ( int j = i; j < n; j += k)
{
if (sortarr.get(i) == arr.get(j))
{
Collections.swap(arr, i, j);
flag = 1 ;
break ;
}
if (j + k >= n)
break ;
}
if (flag == 0 )
break ;
}
if (flag == 0 )
System.out.println( "Not possible to sort" );
else
System.out.println( "Possible to sort" );
}
}
public static void main(String[] args)
{
int k = 3 ;
Vector<Integer> arr = new Vector<Integer>();
arr.add( 1 );
arr.add( 5 );
arr.add( 6 );
arr.add( 9 );
arr.add( 2 );
arr.add( 3 );
arr.add( 5 );
arr.add( 9 );
int n = arr.size();
CheckSort(arr, k, n);
}
}
|
Python3
def CheckSort(arr, k, n):
sortarr = sorted (arr)
if (k = = 1 ):
print ( "yes" )
else :
for i in range ( 0 , n):
flag = 0
for j in range (i, n, k):
if (sortarr[i] = = arr[j]):
arr[i], arr[j] = arr[j], arr[i]
flag = 1
break
if (j + k > = n):
break
if (flag = = 0 ):
break
if (flag = = 0 ):
print ( "Not possible to sort" )
else :
print ( "Possible to sort" )
if __name__ = = "__main__" :
k = 3
arr = [ 1 , 5 , 6 , 9 , 2 , 3 , 5 , 9 ]
n = len (arr)
CheckSort(arr, k, n)
|
C#
using System;
using System.Collections;
using System.Collections.Generic;
class GFG{
static void CheckSort(ArrayList arr, int k, int n)
{
ArrayList sortarr = new ArrayList(arr);
sortarr.Sort();
if (k == 1)
Console.Write( "yes" );
else
{
int flag = 0;
for ( int i = 0; i < n; i++)
{
flag = 0;
for ( int j = i; j < n; j += k)
{
if (( int )sortarr[i] == ( int )arr[j])
{
int tmp = ( int )arr[i];
arr[i] = ( int )arr[j];
arr[j] = tmp;
flag = 1;
break ;
}
if (j + k >= n)
{
break ;
}
}
if (flag == 0)
{
break ;
}
}
if (flag == 0)
Console.Write( "Not possible to sort" );
else
Console.Write( "Possible to sort" );
}
}
public static void Main( string [] args)
{
int k = 3;
ArrayList arr = new ArrayList(){ 1, 5, 6, 9,
2, 3, 5, 9 };
int n = arr.Count;
CheckSort(arr, k, n);
}
}
|
Javascript
<script>
function CheckSort(arr, k, n)
{
var sortarr = arr.sort((a, b) => a - b);
if (k === 1) document.write( "yes" );
else
{
var flag = 0;
for ( var i = 0; i < n; i++) {
flag = 0;
for ( var j = i; j < n; j += k)
{
if (sortarr[i] === arr[j])
{
var tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
flag = 1;
break ;
}
if (j + k >= n) {
break ;
}
}
if (flag === 0) {
break ;
}
}
if (flag === 0) document.write( "Not possible to sort" );
else document.write( "Possible to sort" );
}
}
var k = 3;
var arr = [1, 5, 6, 9, 2, 3, 5, 9];
var n = arr.length;
CheckSort(arr, k, n);
</script>
|
Performance Analysis:
Time complexity: O(N^2) Where N is size of array. worst case
Auxiliary Space: O(N) where N is size of array.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...