Given an array of N distinct elements, find the minimum number of swaps required to sort the array.
Note: The problem is not asking to sort the array by the minimum number of swaps. The problem is to find the minimum swaps in which the array can be sorted.
Examples:
Input: arr[] = {4, 3, 2, 1}
Output: 2
Explanation: Swap index 0 with 3 and 1 with
2 to get the sorted array {1, 2, 3, 4}.
Input: arr[] = { 3, 5, 2, 4, 6, 8}
Output: 3
Explanation:
Swap 4 and 5 so array = 3, 4, 2, 5, 6, 8
Swap 2 and 3 so array = 2, 4, 3, 5, 6, 8
Swap 4 and 3 so array = 2, 3, 4, 5, 6, 8
So the array is sorted.
This problem is already discussed in the previous article using graph. In this article another approach to solve this problem is discussed which is slightly different from the cycle approach.
Approach:
The idea is to create a vector of pair in C++ with first element as array values and second element as array indices. The next step is to sort the vector of pair according to the first element of the pair. After that traverse the vector and check if the index mapped with the value is correct or not, if not then keep swapping until the element is placed correctly and keep counting the number of swaps.
Algorithm:
- Create a vector of pairs and traverse the array and for every element of the array insert a element-index pair in the vector
- Traverse the vector from start to the end (loop counter is i).
- For every element of the pair where the second element(index) is not equal to i. Swap the ith element of the vector with the second element(index) th element of the vector
- If the second element(index) is equal to i then skip the iteration of the loop.
- if after the swap the second element(index) is not equal to i then decrement i.
- Increment the counter.
Implementation:
C++
#include<bits/stdc++.h>
using namespace std;
int findMinSwap( int arr[] , int n)
{
vector<pair< int , int >> vec(n);
for ( int i=0;i<n;i++)
{
vec[i].first=arr[i];
vec[i].second=i;
}
sort(vec.begin(),vec.end());
int ans=0,c=0,j;
for ( int i=0;i<n;i++)
{
if (vec[i].second==i)
continue ;
else
{
swap(vec[i].first,vec[vec[i].second].first);
swap(vec[i].second,vec[vec[i].second].second);
}
if (i!=vec[i].second)
--i;
ans++;
}
return ans;
}
int main()
{
int arr[] = {1, 5, 4, 3, 2};
int n = sizeof (arr)/ sizeof (arr[0]);
cout<<findMinSwap(arr,n);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static class Point implements Comparable<Point>
{
public int x, y;
public Point( int x, int y)
{
this .x = x;
this .y = y;
}
public int compareTo(Point other)
{
return this .x - other.x;
}
}
static int findMinSwap( int [] arr, int n)
{
List<Point> vec = new ArrayList<Point>();
for ( int i = 0 ; i < n; i++)
{
vec.add( new Point(arr[i], i));
}
Collections.sort(vec);
int ans = 0 ;
for ( int i = 0 ; i < n; i++)
{
if (vec.get(i).y == i)
continue ;
else
{
Point temp = vec.get(vec.get(i).y);
vec.set(vec.get(i).y,vec.get(i));
vec.set(i, temp);
}
if (i != vec.get(i).y)
--i;
ans++;
}
return ans;
}
public static void main(String []args)
{
int [] arr = { 1 , 5 , 4 , 3 , 2 };
int n = arr.length;
System.out.println(findMinSwap(arr,n));
}
}
|
Python3
def findMinSwap(arr, n):
vec = []
for i in range (n):
vec.append([arr[i], i])
vec = sorted (vec)
ans, c, j = - 1 , 0 , 0
for i in range (n):
if (vec[i][ 1 ] = = i):
continue
else :
vec[i][ 0 ], vec[vec[i][ 1 ]][ 1 ] = \
vec[vec[i][ 1 ]][ 1 ], vec[i][ 0 ]
vec[i][ 1 ], vec[vec[i][ 1 ]][ 1 ] = \
vec[vec[i][ 1 ]][ 1 ], vec[i][ 1 ]
if (i ! = vec[i][ 1 ]):
i - = 1
ans + = 1
return ans
arr = [ 1 , 5 , 4 , 3 , 2 ]
n = len (arr)
print (findMinSwap(arr,n))
|
C#
using System;
using System.Collections.Generic;
class GFG{
static int findMinSwap( int [] arr, int n)
{
List<Tuple< int ,
int >> vec = new List<Tuple< int ,
int >>();
for ( int i = 0; i < n; i++)
{
vec.Add( new Tuple< int , int >(arr[i], i));
}
vec.Sort();
int ans = 0;
for ( int i = 0; i < n; i++)
{
if (vec[i].Item2 == i)
continue ;
else
{
Tuple< int , int > temp = vec[vec[i].Item2];
vec[vec[i].Item2] = vec[i];
vec[i] = temp;
}
if (i != vec[i].Item2)
--i;
ans++;
}
return ans;
}
static void Main()
{
int [] arr = { 1, 5, 4, 3, 2 };
int n = arr.Length;
Console.Write(findMinSwap(arr,n));
}
}
|
Javascript
function findMinSwap(arr, n) {
let vec = [];
for (let i = 0; i < n; i++) {
vec.push([arr[i], i]);
}
vec.sort( function (a, b) {
return a[0] - b[0];
});
let ans = 0, c = 0;
for (let i = 0; i < n; i++) {
if (vec[i][1] == i) {
continue ;
}
else {
let t = vec[i][1]
let c = vec[i][0]
[vec[i][0], vec[t][0]] = [vec[t][0], vec[i][0]];
[vec[i][1], vec[t][1]] = [vec[t][1], vec[i][1]];
}
if (i != vec[i][1])
i--;
ans += 1;
}
return ans;
}
let arr = [1, 5, 4, 3, 2];
let n = arr.length;
console.log(findMinSwap(arr, n));
|
Complexity Analysis:
- Time Complexity: O(n Log n).
Time required to sort the array is n log n.
- Auxiliary Space: O(n).
An extra array or vector is created. So, the space complexity is O(n )
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
28 Dec, 2022
Like Article
Save Article