Swaps required to sort an array

Given an array of n distinct elements, find the minimum number of swaps required to sort the array.

Examples:

Input: {4, 3, 2, 1}
Output: 2
Explanation: Swap index 0 with 3 and 1 with 2 to
form the sorted array {1, 2, 3, 4}.

Input: {1, 5, 4, 3, 2}
Output: 2

Below is the implementation of the idea.

// Java program to find

// minimum number of swaps

// required to sort an array

import javafx.util.Pair;

import java.util.ArrayList;

import java.util.*;

class GfG

{

`` // Function returns the

`` // minimum number of swaps

`` // required to sort the array

`` public static int minSwaps( int [] arr)

`` {

`` int n = arr.length;

`` // Create two arrays and

`` // use as pairs where first

`` // array is element and second array

`` // is position of first element

`` ArrayList <Pair <Integer, Integer> > arrpos =

`` new ArrayList <Pair <Integer,

`` Integer> > ();

`` for ( int i = 0 ; i < n; i++)

`` arrpos.add( new Pair <Integer,

`` Integer> (arr[i], i));

`` // Sort the array by array element values to

`` // get right position of every element as the

`` // elements of second array.

`` arrpos.sort( new Comparator<Pair<Integer,

`` Integer>>()

`` {

`` @Override

`` public int compare(Pair<Integer, Integer> o1,

`` Pair<Integer, Integer> o2)

`` {

`` if (o1.getKey() > o2.getKey())

`` return - 1 ;

`` // We can change this to make

`` // it then look at the

`` // words alphabetical order

`` else if (o1.getKey().equals(o2.getKey()))

`` return 0 ;

`` else

`` return 1 ;

`` }

`` });

`` // To keep track of visited elements. Initialize

`` // all elements as not visited or false.

`` Boolean[] vis = new Boolean[n];

`` Arrays.fill(vis, false );

`` // Initialize result

`` int ans = 0 ;

`` // Traverse array elements

`` for ( int i = 0 ; i < n; i++)

`` {

`` // already swapped and corrected or

`` // already present at correct pos

`` if (vis[i] || arrpos.get(i).getValue() == i)

`` continue ;

`` // find out the number of node in

`` // this cycle and add in ans

`` int cycle_size = 0 ;

`` int j = i;

`` while (!vis[j])

`` {

`` vis[j] = true ;

`` // move to next node

`` j = arrpos.get(j).getValue();

`` cycle_size++;

`` }

`` // Update answer by adding current cycle.

`` if (cycle_size > 0 )

`` {

`` ans += (cycle_size - 1 );

`` }

`` }

`` // Return result

`` return ans;

`` }

}

// Driver class

class MinSwaps

{

`` // Driver program to test the above function

`` public static void main(String[] args)

`` {

`` int []a = { 1 , 5 , 4 , 3 , 2 };

`` GfG g = new GfG();

`` System.out.println(g.minSwaps(a));

`` }

}

Output:

2

Time Complexity: O(n Log n)
Auxiliary Space: O(n)