mirror of
https://github.com/TheAlgorithms/Python.git
synced 2025-12-19 02:07:27 +08:00
Create cyclic_sort.py (#9256)
* Create cyclic_sort.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update cyclic_sort.py * updating DIRECTORY.md * Update cyclic_sort.py * Update cyclic_sort.py * Update cyclic_sort.py * Update cyclic_sort.py * Update cyclic_sort.py --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Maxim Smolskiy <mithridatus@mail.ru> Co-authored-by: MaximSmolskiy <MaximSmolskiy@users.noreply.github.com>
This commit is contained in:
@@ -1267,6 +1267,7 @@
|
||||
* [Comb Sort](sorts/comb_sort.py)
|
||||
* [Counting Sort](sorts/counting_sort.py)
|
||||
* [Cycle Sort](sorts/cycle_sort.py)
|
||||
* [Cyclic Sort](sorts/cyclic_sort.py)
|
||||
* [Double Sort](sorts/double_sort.py)
|
||||
* [Dutch National Flag Sort](sorts/dutch_national_flag_sort.py)
|
||||
* [Exchange Sort](sorts/exchange_sort.py)
|
||||
|
||||
55
sorts/cyclic_sort.py
Normal file
55
sorts/cyclic_sort.py
Normal file
@@ -0,0 +1,55 @@
|
||||
"""
|
||||
This is a pure Python implementation of the Cyclic Sort algorithm.
|
||||
|
||||
For doctests run following command:
|
||||
python -m doctest -v cyclic_sort.py
|
||||
or
|
||||
python3 -m doctest -v cyclic_sort.py
|
||||
For manual testing run:
|
||||
python cyclic_sort.py
|
||||
or
|
||||
python3 cyclic_sort.py
|
||||
"""
|
||||
|
||||
|
||||
def cyclic_sort(nums: list[int]) -> list[int]:
|
||||
"""
|
||||
Sorts the input list of n integers from 1 to n in-place
|
||||
using the Cyclic Sort algorithm.
|
||||
|
||||
:param nums: List of n integers from 1 to n to be sorted.
|
||||
:return: The same list sorted in ascending order.
|
||||
|
||||
Time complexity: O(n), where n is the number of integers in the list.
|
||||
|
||||
Examples:
|
||||
>>> cyclic_sort([])
|
||||
[]
|
||||
>>> cyclic_sort([3, 5, 2, 1, 4])
|
||||
[1, 2, 3, 4, 5]
|
||||
"""
|
||||
|
||||
# Perform cyclic sort
|
||||
index = 0
|
||||
while index < len(nums):
|
||||
# Calculate the correct index for the current element
|
||||
correct_index = nums[index] - 1
|
||||
# If the current element is not at its correct position,
|
||||
# swap it with the element at its correct index
|
||||
if index != correct_index:
|
||||
nums[index], nums[correct_index] = nums[correct_index], nums[index]
|
||||
else:
|
||||
# If the current element is already in its correct position,
|
||||
# move to the next element
|
||||
index += 1
|
||||
|
||||
return nums
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import doctest
|
||||
|
||||
doctest.testmod()
|
||||
user_input = input("Enter numbers separated by a comma:\n").strip()
|
||||
unsorted = [int(item) for item in user_input.split(",")]
|
||||
print(*cyclic_sort(unsorted), sep=",")
|
||||
Reference in New Issue
Block a user