RedEnginePress logo
RedEnginePress
AlgorithmsLanguagesPlaygroundAbout

Cycle Sort

S
M
D
p
O
A
P
R
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
}
About this Algorithm

Problem Statement

Given an unsorted array of n elements, write a function to sort the array

Approach

  • If the element is already at its correct position do nothing
  • Otherwise, find the correct position of a by counting the total number of elements that are less than current element
  • Insert current element into its correct position
  • Set replaced element as new current element and find its correct position
  • Continue process until array is sorted

Time Complexity

O(n^2) Worst case performance

O(n^2) Best-case performance

O(n^2) Average performance

Space Complexity

O(n) Worst case

Application of algorithm

  • Cycle sort algorithm is useful for situations where memory write or element swap operations are costly.

Example

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.

Video Explanation

A video explaining the Cycle Sort Algorithm

The Algorithms Page

Cycle Sort