Minimum number of swaps required to sort an array | Set 2

03 Mar, 2021
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 vectorTraverse 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 vectorIf 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.
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++
Java
Python3
C#
// C++ program to find the minimum number// of swaps required to sort an array// of distinct element #include<bits/stdc++.h>using namespace std; // Function to find minimum swaps to// sort an arrayint findMinSwap(int arr[] , int n){    // Declare a vector of pair        vector<pair<int,int>> vec(n);         for(int i=0;i<n;i++)    {        vec[i].first=arr[i];        vec[i].second=i;    }     // Sort the vector w.r.t the first    // element of pair    sort(vec.begin(),vec.end());     int ans=0,c=0,j;     for(int i=0;i<n;i++)    {          // If the element is already placed        // correct, then continue        if(vec[i].second==i)            continue;        else        {            // swap with its respective index            swap(vec[i].first,vec[vec[i].second].first);            swap(vec[i].second,vec[vec[i].second].second);        }                 // swap until the correct        // index matches        if(i!=vec[i].second)            --i;                 // each swap makes one element        // move to its correct index,        // so increment answer        ans++;    }     return ans;} // Driver codeint main(){    int arr[] = {1, 5, 4, 3, 2};         int n = sizeof(arr)/sizeof(arr[0]);         cout<<findMinSwap(arr,n);         return 0;}
// Java program to find the minimum number // of swaps required to sort an array// of distinct elementimport 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;    }}         // Function to find minimum swaps to // sort an arraystatic int findMinSwap(int[] arr, int n){          // Declare a vector of pair      List<Point> vec = new ArrayList<Point>();                                                for(int i = 0; i < n; i++)    {        vec.add(new Point(arr[i], i));    }        // Sort the vector w.r.t the first    // element of pair    Collections.sort(vec);      int ans = 0;    for(int i = 0; i < n; i++)    {                   // If the element is already placed        // correct, then continue        if (vec.get(i).y == i)             continue;        else        {                          // Swap with its respective index             Point temp = vec.get(vec.get(i).y);            vec.set(vec.get(i).y,vec.get(i));            vec.set(i, temp);        }                   // Swap until the correct         // index matches        if (i != vec.get(i).y)            --i;                    // Each swap makes one element        // move to its correct index,         // so increment answer        ans++;    }    return ans;}  // Driver Codepublic static void main(String []args){    int[] arr = { 1, 5, 4, 3, 2 };    int n = arr.length;         System.out.println(findMinSwap(arr,n));}} // This code is contributed by Pratham76
# Python3 program to find the minimum number# of swaps required to sort an array# of distinct element # Function to find minimum swaps to# sort an arraydef findMinSwap(arr, n):         # Declare a vector of pair    vec = []     for i in range(n):        vec.append([arr[i], i])     # Sort the vector w.r.t the first    # element of pair    vec = sorted(vec)     ans, c, j = -1, 0, 0     for i in range(n):                 # If the element is already placed        # correct, then continue        if(vec[i][1] == i):            continue        else:            # swap with its respective index            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]         # swap until the correct        # index matches        if(i != vec[i][1]):            i -= 1         # each swap makes one element        # move to its correct index,        # so increment answer        ans += 1     return ans # Driver codearr = [1, 5, 4, 3, 2]n = len(arr)print(findMinSwap(arr,n)) # This code is contributed by mohit kumar 29
// C# program to find the minimum number // of swaps required to sort an array// of distinct elementusing System;using System.Collections.Generic; class GFG{     // Function to find minimum swaps to // sort an arraystatic int findMinSwap(int[] arr, int n){         // Declare a vector of pair      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));    }       // Sort the vector w.r.t the first    // element of pair    vec.Sort();       int ans = 0;       for(int i = 0; i < n; i++)    {                  // If the element is already placed        // correct, then continue        if (vec[i].Item2 == i)             continue;        else        {                         // Swap with its respective index             Tuple<int, int> temp = vec[vec[i].Item2];            vec[vec[i].Item2] = vec[i];            vec[i] = temp;        }                  // Swap until the correct         // index matches        if (i != vec[i].Item2)            --i;                   // Each swap makes one element        // move to its correct index,         // so increment answer        ans++;    }    return ans;} // Driver Codestatic void Main(){    int[] arr = { 1, 5, 4, 3, 2 };    int n = arr.Length;         Console.Write(findMinSwap(arr,n));}} // This code is contributed by divyeshrabadiya07
2
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 )
mohit kumar 29
mv15
andrew1234
divyeshrabadiya07
pratham76
ujjwalmittal
Constructive Algorithms
cpp-pair
cpp-vector
Sorting Quiz
Arrays
C++ Programs
Arrays
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Introduction to Arrays
Introduction to Data Structures
Search an element in a sorted and rotated array
Find Second largest element in an array
Count Inversions in an array | Set 1 (Using Merge Sort)
Header files in C/C++ and its uses
Sorting a Map by value in C++ STL
Program to print ASCII Value of a character
How to return multiple values from a function in C or C++?
Shallow Copy and Deep Copy in C++