50

I'm working on sorting an integer sequence with no identical numbers (without loss of generality, let's assume the sequence is a permutation of 1,2,...,n) into its natural increasing order (i.e. 1,2,...,n). I was thinking about directly swapping the elements (regardless of the positions of elements; in other words, a swap is valid for any two elements) with minimal number of swaps (the following may be a feasible solution):

Swap two elements with the constraint that either one or both of them should be swapped into the correct position(s). Until every element is put in its correct position.

But I don't know how to mathematically prove if the above solution is optimal. Anyone can help?

Georgy
  • 12,464
  • 7
  • 65
  • 73
mintaka
  • 982
  • 1
  • 9
  • 25
  • Highly related / duplicate: [Minimum number of swaps needed to change Array 1 to Array 2?](https://stackoverflow.com/questions/2987605/minimum-number-of-swaps-needed-to-change-array-1-to-array-2) – Bernhard Barker Jun 19 '19 at 12:15

19 Answers19

72

I was able to prove this with . Might want to add that tag in :)

Create a graph with n vertices. Create an edge from node n_i to n_j if the element in position i should be in position j in the correct ordering. You will now have a graph consisting of several non-intersecting cycles. I argue that the minimum number of swaps needed to order the graph correctly is

M = sum (c in cycles) size(c) - 1

Take a second to convince yourself of that...if two items are in a cycle, one swap can just take care of them. If three items are in a cycle, you can swap a pair to put one in the right spot, and a two-cycle remains, etc. If n items are in a cycle, you need n-1 swaps. (This is always true even if you don't swap with immediate neighbors.)

Given that, you may now be able to see why your algorithm is optimal. If you do a swap and at least one item is in the right position, then it will always reduce the value of M by 1. For any cycle of length n, consider swapping an element into the correct spot, occupied by its neighbor. You now have a correctly ordered element, and a cycle of length n-1.

Since M is the minimum number of swaps, and your algorithm always reduces M by 1 for each swap, it must be optimal.

Aadit M Shah
  • 72,912
  • 30
  • 168
  • 299
Andrew Mao
  • 35,740
  • 23
  • 143
  • 224
  • 1
    what will be time complexity of this? – puneet Jan 30 '17 at 16:26
  • 3
    Time complexity : O(n*logn) Space complexity : O(n) @puneet – Rewanth Tammana Feb 20 '17 at 17:20
  • But how is that a proof of *minimality*? "I argue that the minimum number of swaps...", "Take a second to convince yourself of that..." Sorry, "arguing" and "convincing yourself" is not enough. You have to actually prove that the above `M` is minimal. – AnT stands with Russia Aug 26 '18 at 16:09
  • @AnT, I agree. Specifically, I can conceive of an algorithm that involves swaps where neither item ends it's intended positions, but achieves the same number of moves. Specifically, one can make swaps to reduce any cycle to a number of two cycles (possibly ending with a single one cycle if `n` is odd), and then swap all of the two cycles into the correct positions. This also involves `n-1` moves. Although this is not faster than the algorithm provided, it at least shows that the optimality of the provided algorithm is far from obvious. – Him Sep 26 '18 at 17:04
  • @AnT Minimality comes from the fact that any `n`-element cycle is minimally the product of `n-1` transpositions – arax Apr 22 '19 at 23:57
  • 3
    Why would the complexity be n*log(n) ? Can anyone throw some intuitive light here ? – sherelock Jul 19 '19 at 19:04
  • Counting the number of swaps in a selection sort is same as this, because it just reduce the length of cycle by one by keeping the cycle intact at each step. – Nitesh Bharadwaj Gundavarapu Aug 19 '19 at 18:50
  • @sherelock We just need to sort which is O(nlogn) and then count the cycles. Since each node has exactly one outgoing edge, we can do this part in O(n) by following the edges. – Nitesh Bharadwaj Gundavarapu Aug 19 '19 at 18:52
  • @NiteshBharadwajGundavarapu, what to you need to sort here? – Evg Feb 26 '20 at 14:56
  • My quick analysis: | sort input array to build graph O(nlgn) with let say quicksort | build hash map to have desired index fast O(n) | build graph with hashmap O(n) | calculate strongly connected components and its size O(n) | sum according to idea O(n) | TOTAL O(nlgn) – lissajous Feb 02 '21 at 22:43
  • @NiteshBharadwajGundavarapu We are not sorting an arbitrary array. Sorting an array of consecutive integers starting at 1 is `O(n)`, not `O(n*logn)`, since for each value `v`, we already know it belongs in position `v-1`. – Allan Pinkerton Nov 21 '21 at 00:52
  • take [1,2,3,4] to [4,2,3,1] – Jean Valj Jan 30 '22 at 18:35
24

All the cycle counting is very difficult to keep in your head. There is a way that is much simpler to memorize.

First, let's go through a sample case manually.

  • Sequence: [7, 1, 3, 2, 4, 5, 6]
  • Enumerate it: [(0, 7), (1, 1), (2, 3), (3, 2), (4, 4), (5, 5), (6, 6)]
  • Sort the enumeration by value: [(1, 1), (3, 2), (2, 3), (4, 4), (5, 5), (6, 6), (0, 7)]
  • Start from the beginning. While the index is different from the enumerated index keep on swapping the elements defined by index and enumerated index. Remember: swap(0,2);swap(0,3) is the same as swap(2,3);swap(0,2)
    • swap(0, 1) => [(3, 2), (1, 1), (2, 3), (4, 4), (5, 5), (6, 6), (0, 7)]
    • swap(0, 3) => [(4, 4), (1, 1), (2, 3), (3, 2), (5, 5), (6, 6), (0, 7)]
    • swap(0, 4) => [(5, 5), (1, 1), (2, 3), (3, 2), (4, 4), (6, 6), (0, 7)]
    • swap(0, 5) => [(6, 6), (1, 1), (2, 3), (3, 2), (4, 4), (5, 5), (0, 7)]
    • swap(0, 6) => [(0, 7), (1, 1), (2, 3), (3, 2), (4, 4), (5, 5), (6, 6)]

I.e. semantically you sort the elements and then figure out how to put them to the initial state via swapping through the leftmost item that is out of place.

Python algorithm is as simple as this:

def swap(arr, i, j):
    arr[i], arr[j] = arr[j], arr[i]


def minimum_swaps(arr):
    annotated = [*enumerate(arr)]
    annotated.sort(key = lambda it: it[1])

    count = 0

    i = 0
    while i < len(arr):
        if annotated[i][0] == i:
            i += 1
            continue
        swap(annotated, i, annotated[i][0])
        count += 1

    return count

Thus, you don't need to memorize visited nodes or compute some cycle length.

MLavoie
  • 9,671
  • 41
  • 36
  • 56
Archibald
  • 1,305
  • 1
  • 14
  • 19
  • this doesn't seem to return the minimal number for arrays with repeat values: [8, 8, 7, 9, 9, 9, 8, 9, 7] => 6, should be 4 – Ryan Wood Feb 11 '20 at 17:22
  • 6
    Checked. Wrote a while ago. Yes. Doesn't work with duplicates. But. My solution fits the problem spec perfectly: "I'm working on sorting an integer sequence with no identical numbers". It was not never meant to work for the lists with duplicates. Thus shall dismiss your comment @RyanWood – Archibald Feb 23 '20 at 22:17
  • Just adding to @Archibald's explanation: this approach works because sorting from from the enumerated + ordered array to the original array is the same number of swaps as the opposite. I found that extra sort a little unnecessary. You can in fact get to the same result by changing the while loop to something like this (in JS): ``` while (i < enumeratedArr.length) { if (enumeratedArr[i][1] == i + 1) { i++ continue } else { swap(enumeratedArr, i, enumeratedArr[i][1] - 1) count++ } } ``` – Dan Engel Mar 30 '21 at 07:14
6

For your reference, here is an algorithm that I wrote, to generate the minimum number of swaps needed to sort the array. It finds the cycles as described by @Andrew Mao.

/**
 * Finds the minimum number of swaps to sort given array in increasing order.
 * @param ar array of <strong>non-negative distinct</strong> integers. 
 *           input array will be overwritten during the call!
 * @return min no of swaps
 */
public int findMinSwapsToSort(int[] ar) {
    int n = ar.length;
    Map<Integer, Integer> m = new HashMap<>();
    for (int i = 0; i < n; i++) {
        m.put(ar[i], i);
    }
    Arrays.sort(ar);
    for (int i = 0; i < n; i++) {
        ar[i] = m.get(ar[i]);
    }
    m = null;
    int swaps = 0;
    for (int i = 0; i < n; i++) {
        int val = ar[i];
        if (val < 0) continue;
        while (val != i) {
            int new_val = ar[val];
            ar[val] = -1;
            val = new_val;
            swaps++;
        }
        ar[i] = -1;
    }
    return swaps;
}
bekce
  • 3,782
  • 29
  • 30
  • Can you explain what is happening in last while loop – GURMEET SINGH Aug 17 '18 at 09:26
  • Can anyone help with understanding the code? I can't seem to grasp the logic behind what is happening – Spindoctor Aug 27 '18 at 17:51
  • @GURMEETSINGH did you figure out the algorithm? – Spindoctor Aug 27 '18 at 18:55
  • @Spindoctor yes I figured it out – GURMEET SINGH Aug 27 '18 at 19:44
  • @GURMEETSINGH, can you please share your understanding of the logic? I can't understand it. – Spindoctor Aug 27 '18 at 19:47
  • 1
    @Spindoctor in first for loop it is keeping the actual value as key and the position in the original array as value. Then the array is sorted using Collections.sort(). in second for loop we are getting index of array prior to sorting. in the last for loop we are making elements of cycle as -1 – GURMEET SINGH Aug 27 '18 at 19:50
  • @Spindoctor the best way to understand this by taking a small array and pass through each step and note down value in different variables. This will help you to see the cycles in the array and how we are making those elements -1. – GURMEET SINGH Aug 27 '18 at 19:57
6

We do not need to swap the actual elements, just find how many elements are not in the right index (Cycle). The min swaps will be Cycle - 1; Here is the code...

static int minimumSwaps(int[] arr) {
        int swap=0;
        boolean visited[]=new boolean[arr.length];

        for(int i=0;i<arr.length;i++){
            int j=i,cycle=0;

            while(!visited[j]){
                visited[j]=true;
                j=arr[j]-1;
                cycle++;
            }

            if(cycle!=0)
                swap+=cycle-1;
        }
        return swap;


    }
loneWolf2019
  • 69
  • 1
  • 3
  • I am not able to relate how the while loops works to find the number of cycles. Specifically, the 2nd statement in the while loop. `j=arr[j]-1;` Why the value of j getting derived by subtracting 1 whereas we are setting it to i at the start. – Ashish Santikari Aug 23 '19 at 06:22
  • the most optimal solution, others are unnecessary swapping the elements where as requirement is just to find minimum count of swaps – Ajay Sharma Sep 02 '20 at 12:30
  • I am thinking the reason `j=arr[j]-1;` @AshishSantikari can be seen by running through the code with an already sorted array. In that case, filling out the `visited` array, fills it out in order, with 0 being the first index, hence the -1. In that case, the while loop terminates after 1 loop each time. If out of order, the array will be temporary sparse with cycles counting how long it takes to "see" it in its correct order, which equates to the number of swaps if you subtract 1 for the 0 based indexing. Very cool. – John Wright Sep 27 '20 at 15:56
3

@Archibald, I like your solution, and such was my initial assumptions that sorting the array would be the simplest solution, but I don't see the need to go through the effort of the reverse-traverse as I've dubbed it, ie enumerating then sorting the array and then computing the swaps for the enums.

I find it simpler to subtract 1 from each element in the array and then to compute the swaps required to sort that list

here is my tweak/solution:

def swap(arr, i, j):
    tmp = arr[i]
    arr[i] = arr[j]
    arr[j] = tmp

def minimum_swaps(arr):

    a = [x - 1 for x in arr]

    swaps = 0
    i = 0
    while i < len(a):
        if a[i] == i:
            i += 1
            continue
        swap(a, i, a[i])
        swaps += 1

    return swaps

As for proving optimality, I think @arax has a good point.

Ieuan Uys
  • 49
  • 5
2

// Assuming that we are dealing with only sequence started with zero

function minimumSwaps(arr) {
    var len = arr.length
    var visitedarr = []
    var i, start, j, swap = 0
    for (i = 0; i < len; i++) {
        if (!visitedarr[i]) {
            start = j = i
            var cycleNode = 1
            while (arr[j] != start) {
                j = arr[j]
                visitedarr[j] = true
                cycleNode++
            }
            swap += cycleNode - 1
        }
    }
    return swap
}
raphinesse
  • 19,068
  • 6
  • 39
  • 48
2

I really liked the solution of @Ieuan Uys in Python.

What I improved on his solution;

  • While loop is iterated one less to increase speed; while i < len(a) - 1
  • Swap function is de-capsulated to make one, single function.
  • Extensive code comments are added to increase readability.

My code in python.

def minimumSwaps(arr):
    #make array values starting from zero to match index values. 
    a = [x - 1 for x in arr] 

    #initialize number of swaps and iterator.
    swaps = 0
    i = 0

    while i < len(a)-1:
        if a[i] == i:
            i += 1
            continue

        #swap.
        tmp = a[i] #create temp variable assign it to a[i]
        a[i] = a[tmp] #assign value of a[i] with a[tmp]
        a[tmp] = tmp #assign value of a[tmp] with tmp (or initial a[i])

        #calculate number of swaps.
        swaps += 1

    return swaps

Detailed explanation on what code does on an array with size n;

We check every value except last one (n-1 iterations) in the array one by one. If the value does not match with array index, then we send this value to its place where index value is equal to its value. For instance, if at a[0] = 3. Then this value should swap with a[3]. a[0] and a[3] is swapped. Value 3 will be at a[3] where it is supposed to be. One value is sent to its place. We have n-2 iteration left. I am not interested what is now a[0]. If it is not 0 at that location, it will be swapped by another value latter. Because that another value also exists in a wrong place, this will be recognized by while loop latter.

Real Example

a[4, 2, 1, 0, 3]
#iteration 0, check a[0]. 4 should be located at a[4] where the value is 3. Swap them. 
a[3, 2, 1, 0, 4] #we sent 4 to the right location now.  
#iteration 1, check a[1]. 2 should be located at a[2] where the value is 1. Swap them. 
a[3, 1, 2, 0, 4] #we sent 2 to the right location now.  
#iteration 2, check a[2]. 2 is already located at a[2]. Don't do anything, continue. 
a[3, 1, 2, 0, 4] 
#iteration 3, check a[3]. 0 should be located at a[0] where the value is 3. Swap them. 
a[0, 1, 2, 3, 4] #we sent 0 to the right location now.  
# There is no need to check final value of array. Since all swaps are done. 
Enis Arik
  • 665
  • 10
  • 24
1

Nicely done solution by @bekce. If using C#, the initial code of setting up the modified array ar can be succinctly expressed as:

var origIndexes = Enumerable.Range(0, n).ToArray();
Array.Sort(ar, origIndexes);

then use origIndexes instead of ar in the rest of the code.

1

Swift 4 version:

func minimumSwaps(arr: [Int]) -> Int {

      struct Pair {
         let index: Int
         let value: Int
      }

      var positions = arr.enumerated().map { Pair(index: $0, value: $1) }
      positions.sort { $0.value < $1.value }
      var indexes = positions.map { $0.index }

      var swaps = 0
      for i in 0 ..< indexes.count {
         var val = indexes[i]
         if val < 0 {
            continue // Already visited.
         }
         while val != i {
            let new_val = indexes[val]
            indexes[val] = -1
            val = new_val
            swaps += 1
         }
         indexes[i] = -1
      }
      return swaps
}
Vlad
  • 6,402
  • 1
  • 60
  • 74
0

This is the sample code in C++ that finds the minimum number of swaps to sort a permutation of the sequence of (1,2,3,4,5,.......n-2,n-1,n)

#include<bits/stdc++.h>
using namespace std;


int main()
{
    int n,i,j,k,num = 0;
    cin >> n;
    int arr[n+1];
    for(i = 1;i <= n;++i)cin >> arr[i];
    for(i = 1;i <= n;++i)
    {
        if(i != arr[i])// condition to check if an element is in a cycle r nt
        {
            j = arr[i];
            arr[i] = 0;
            while(j != 0)// Here i am traversing a cycle as mentioned in 
            {             // first answer
                k = arr[j];
                arr[j] = j;
                j = k;
                num++;// reducing cycle by one node each time
            }
            num--;
        }
    }
    for(i = 1;i <= n;++i)cout << arr[i] << " ";cout << endl;
    cout << num << endl;
    return 0;
}
takrl
  • 6,356
  • 3
  • 60
  • 69
Vinayak Sangar
  • 107
  • 2
  • 12
0

Solution using Javascript.

First I set all the elements with their current index that need to be ordered, and then I iterate over the map to order only the elements that need to be swapped.

function minimumSwaps(arr) {
  const mapUnorderedPositions = new Map()
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] !== i+1) {
      mapUnorderedPositions.set(arr[i], i)
    }
  }

  let minSwaps = 0
  while (mapUnorderedPositions.size > 1) {
    const currentElement = mapUnorderedPositions.entries().next().value
    const x = currentElement[0]
    const y = currentElement[1]

    // Skip element in map if its already ordered
    if (x-1 !== y) {
      // Update unordered position index of swapped element
      mapUnorderedPositions.set(arr[x-1], y)

      // swap in array
      arr[y] = arr[x-1]
      arr[x-1] = x

      // Increment swaps
      minSwaps++
    }

    mapUnorderedPositions.delete(x)
  }


  return minSwaps
}

If you have an input like 7 2 4 3 5 6 1, this is how the debugging will go:

Map { 7 => 0, 4 => 2, 3 => 3, 1 => 6 }
currentElement [ 7, 0 ]
swapping 1 with 7
[ 1, 2, 4, 3, 5, 6, 7 ]

currentElement [ 4, 2 ]
swapping 3 with 4
[ 1, 2, 3, 4, 5, 6, 7 ]

currentElement [ 3, 2 ]
skipped

minSwaps = 2
remacr
  • 648
  • 6
  • 6
0

Finding the minimum number of swaps required to put a permutation of 1..N in order.

We can use that the we know what the sort result would be: 1..N, which means we don't actually have to do swaps just count them.

The shuffling of 1..N is called a permutation, and is composed of disjoint cyclic permutations, for example, this permutation of 1..6:

1 2 3 4 5 6
6 4 2 3 5 1

Is composed of the cyclic permutations (1,6)(2,4,3)(5)

1->6(->1) cycle: 1 swap
2->4->3(->2) cycle: 2 swaps
5(->5) cycle: 0 swaps

So a cycle of k elements requires k-1 swaps to put in order.

Since we know where each element "belongs" (i.e. value k belongs at position k-1) we can easily traverse the cycle. Start at 0, we get 6, which belongs at 5, and there we find 1, which belongs at 0 and we're back where we started.

To avoid re-counting a cycle later, we track which elements were visited - alternatively you could perform the swaps so that the elements are in the right place when you visit them later.

The resulting code:

def minimumSwaps(arr):
    visited = [False] * len(arr)
    numswaps = 0
    for i in range(len(arr)):
        if not visited[i]:
            visited[i] = True
            j = arr[i]-1
            while not visited[j]:
                numswaps += 1
                visited[j] = True
                j = arr[j]-1
    return numswaps
Graham
  • 876
  • 1
  • 9
  • 12
-1

An implementation on integers with primitive types in Java (and tests).

import java.util.Arrays;

public class MinSwaps {
  public static int computate(int[] unordered) {
    int size = unordered.length;
    int[] ordered = order(unordered);
    int[] realPositions = realPositions(ordered, unordered);
    boolean[] touchs = new boolean[size];
    Arrays.fill(touchs, false);
    int i;
    int landing;
    int swaps = 0;

    for(i = 0; i < size; i++) {
      if(!touchs[i]) {
        landing = realPositions[i];

        while(!touchs[landing]) {
          touchs[landing] = true;
          landing = realPositions[landing];

          if(!touchs[landing]) { swaps++; }
        }
      }
    }

    return swaps;
  }

  private static int[] realPositions(int[] ordered, int[] unordered) {
    int i;
    int[] positions = new int[unordered.length];

    for(i = 0; i < unordered.length; i++) {
      positions[i] = position(ordered, unordered[i]);
    }

    return positions;
  }

  private static int position(int[] ordered, int value) {
    int i;

    for(i = 0; i < ordered.length; i++) {
      if(ordered[i] == value) {
        return i;
      }
    }

    return -1;
  }

  private static int[] order(int[] unordered) {
    int[] ordered = unordered.clone();
    Arrays.sort(ordered);

    return ordered;
  }
}

Tests

import org.junit.Test;

import static org.junit.Assert.assertEquals;

public class MinimumSwapsSpec {
  @Test
  public void example() {
    // setup
    int[] unordered = new int[] { 40, 23, 1, 7, 52, 31 };

    // run
    int minSwaps = MinSwaps.computate(unordered);

    // verify
    assertEquals(5, minSwaps);
  }

  @Test
  public void example2() {
    // setup
    int[] unordered = new int[] { 4, 3, 2, 1 };

    // run
    int minSwaps = MinSwaps.computate(unordered);

    // verify
    assertEquals(2, minSwaps);
  }

  @Test
  public void example3() {
    // setup
    int[] unordered = new int[] {1, 5, 4, 3, 2};

    // run
    int minSwaps = MinSwaps.computate(unordered);

    // verify
    assertEquals(2, minSwaps);
  }
}
-1

Swift 4.2:

func minimumSwaps(arr: [Int]) -> Int {
    let sortedValueIdx = arr.sorted().enumerated()
        .reduce(into: [Int: Int](), { $0[$1.element] = $1.offset })

    var checked = Array(repeating: false, count: arr.count)
    var swaps = 0

    for idx in 0 ..< arr.count {
        if checked[idx] { continue }

        var edges = 1
        var cursorIdx = idx
        while true {
            let cursorEl = arr[cursorIdx]
            let targetIdx = sortedValueIdx[cursorEl]!
            if targetIdx == idx {
                break
            } else {
                cursorIdx = targetIdx
                edges += 1
            }
            checked[targetIdx] = true
        }
        swaps += edges - 1
    }

    return swaps
}
duan
  • 8,515
  • 3
  • 48
  • 70
-1

Python code

A = [4,3,2,1]
count = 0
for i in range (len(A)):
    min_idx = i
    for j in range (i+1,len(A)):
        if A[min_idx] > A[j]:
            min_idx = j
    if min_idx > i:
        A[i],A[min_idx] = A[min_idx],A[i]
        count = count + 1
print "Swap required : %d" %count
Ankit
  • 9
  • 2
-1

In Javascript

If the count of the array starts with 1

function minimumSwaps(arr) {
   var len = arr.length
    var visitedarr = []
    var i, start, j, swap = 0
    for (i = 0; i < len; i++) {
        if (!visitedarr[i]) {
            start = j = i
            var cycleNode = 1
            while (arr[j] != start + 1) {
                j = arr[j] - 1
                visitedarr[j] = true
                cycleNode++
            }
            swap += cycleNode - 1
        }
    }
    return swap
}

else for input starting with 0

function minimumSwaps(arr) {
    var len = arr.length
    var visitedarr = []
    var i, start, j, swap = 0
    for (i = 0; i < len; i++) {
        if (!visitedarr[i]) {
            start = j = i
            var cycleNode = 1
            while (arr[j] != start) {
                j = arr[j]
                visitedarr[j] = true
                cycleNode++
            }
            swap += cycleNode - 1
        }
    }
    return swap
}

Just extending Darshan Puttaswamy code for current HackerEarth inputs

Alwaysblue
  • 9,948
  • 38
  • 121
  • 210
-1
def swap_sort(arr)
  changes = 0
  loop do
    # Find a number that is out-of-place
    _, i = arr.each_with_index.find { |val, index| val != (index + 1) }
    if i != nil
      # If such a number is found, then `j` is the position that the out-of-place number points to.
      j = arr[i] - 1

      # Swap the out-of-place number with number from position `j`.
      arr[i], arr[j] = arr[j], arr[i]

      # Increase swap counter.
      changes += 1
    else
      # If there are no out-of-place number, it means the array is sorted, and we're done.
      return changes
    end
  end
end                                                                                                
antonone
  • 2,045
  • 1
  • 25
  • 35
-1

Apple Swift version 5.2.4

func minimumSwaps(arr: [Int]) -> Int {
    var swapCount = 0
    var arrayPositionValue = [(Int, Int)]()
    var visitedDictionary = [Int: Bool]()
    
    for (index, number) in arr.enumerated() {
        arrayPositionValue.append((index, number))
        visitedDictionary[index] = false
    }
    
    arrayPositionValue = arrayPositionValue.sorted{ $0.1 < $1.1 }

    for i in 0..<arr.count {
        var cycleSize = 0
        var visitedIndex = i

        while !visitedDictionary[visitedIndex]! {
            visitedDictionary[visitedIndex] = true
            visitedIndex = arrayPositionValue[visitedIndex].0
            cycleSize += 1
        }

        if cycleSize > 0 {
            swapCount += cycleSize - 1
        }
    }

    return swapCount
}

hectorsvill
  • 681
  • 8
  • 7
-1

Go version 1.17:

func minimumSwaps(arr []int32) int32 {

var swap int32
for i := 0; i < len(arr) - 1; i++{
    for j := 0; j < len(arr); j++ {
        if arr[j] > arr[i] {
            arr[i], arr[j] = arr[j], arr[i]
            swap++
        }else {
        continue
    }
    }
} 
return swap
}
Aldy
  • 1
  • 1