package sort
import (
"github.com/TheAlgorithms/Go/constraints"
)
// Cycle sort is an in-place, unstable sorting algorithm that is particularly useful
// when sorting arrays containing elements with a small range of values. It is theoretically
// optimal in terms of the total number of writes to the original array.
func Cycle[T constraints.Number](arr []T) []T {
counter, cycle, len := 0, 0, len(arr)
// Early return if the array too small
if len <= 1 {
return arr
}
for cycle = 0; cycle < len-1; cycle++ {
elem := arr[cycle]
// Find total smaller elements to right
pos := cycle
for counter = cycle + 1; counter < len; counter++ {
if arr[counter] < elem {
pos++
}
}
// In case this element is already in correct position, let's skip processing
if pos == cycle {
continue
}
// In case we have same elements, we want to skip to the end of that list as well, ignoring order
// This makes the algorithm unstable for composite elements
for elem == arr[pos] {
pos++
}
// Now let us put the item to it's right position
arr[pos], elem = elem, arr[pos]
//We need to rotate the array till we have reached the start of the cycle again
for pos != cycle {
pos = cycle
// Find smaller elements to right again
for counter = cycle + 1; counter < len; counter++ {
if arr[counter] < elem {
pos++
}
}
for elem == arr[pos] {
pos++
}
//We can do this unconditionally, but the check helps prevent redundant writes to the array
if elem != arr[pos] {
arr[pos], elem = elem, arr[pos]
}
}
}
return arr
}
Given an unsorted array of n elements, write a function to sort the array
O(n^2) Worst case performance
O(n^2) Best-case performance
O(n^2) Average performance
O(n) Worst case
A single cycle of sorting array | b | d | e | a | c |
1. Select element for which the cycle is run, i.e. "b".
|b|d|e|a|c|
b - current element
2. Find correct location for current element and update current element.
|b|b|e|a|c|
d - current element
3. One more time, find correct location for current element and update current element.
|b|b|e|d|c|
a - current element
4. Current element is inserted into position of initial element "b" which ends the cycle.
|a|b|e|d|c|
a - current element
5. New cycle should be started for next element.
A video explaining the Cycle Sort Algorithm