From eaf2ebd544b89b7793a9dc3fc9648667d8815461 Mon Sep 17 00:00:00 2001 From: mishraabhinn <49574460+mishraabhinn@users.noreply.github.com> Date: Wed, 20 May 2020 00:26:59 +0530 Subject: [PATCH] SwapSort.cpp (#754) * Create Swap Sort(Minimum) * Update Swap Sort(Minimum) * Update Swap Sort(Minimum) * Rename Swap Sort(Minimum) to SwapSort.cpp * Update SwapSort.cpp * Update SwapSort.cpp * Update SwapSort.cpp * Rename SwapSort.cpp to swap_sort.cpp Co-authored-by: Christian Clauss --- sorting/swap_sort.cpp | 66 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 sorting/swap_sort.cpp diff --git a/sorting/swap_sort.cpp b/sorting/swap_sort.cpp new file mode 100644 index 000000000..a4ab1e57b --- /dev/null +++ b/sorting/swap_sort.cpp @@ -0,0 +1,66 @@ +// C++ program to find minimum number of swaps required to sort an array +#include +#include +#include +#include + +// Function returns the minimum number of swaps +// required to sort the array +int minSwaps(int arr[], int n) { + // Create an array of pairs where first + // element is array element and second element + // is position of first element + std::pair arrPos[n]; + for (int i = 0; i < n; i++) { + arrPos[i].first = arr[i]; + arrPos[i].second = i; + } + + // Sort the array by array element values to + // get right position of every element as second + // element of pair. + std::sort(arrPos, arrPos + n); + + // To keep track of visited elements. Initialize + // all elements as not visited or false. + std::vector vis(n, 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[i].second == 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] = 1; + + // move to next node + j = arrPos[j].second; + cycle_size++; + } + + // Update answer by adding current cycle. + if (cycle_size > 0) { + ans += (cycle_size - 1); + } + } + + // Return result + return ans; +} + +// program to test +int main() { + int arr[] = {6, 7, 8, 1, 2, 3, 9, 12}; + int n = (sizeof(arr) / sizeof(int)); + std::cout << minSwaps(arr, n); + return 0; +}