mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-27 23:11:09 +00:00
Optimization for shell sort (#4038)
* fixed shell sort * udpate code style * Update sorts/shell_sort.py Co-authored-by: John Law <johnlaw.po@gmail.com> Co-authored-by: John Law <johnlaw.po@gmail.com>
This commit is contained in:
parent
ae8a5f8675
commit
53371b2381
|
@ -1,13 +1,5 @@
|
||||||
"""
|
"""
|
||||||
This is a pure Python implementation of the shell sort algorithm
|
https://en.wikipedia.org/wiki/Shellsort#Pseudocode
|
||||||
|
|
||||||
For doctests run following command:
|
|
||||||
python -m doctest -v shell_sort.py
|
|
||||||
or
|
|
||||||
python3 -m doctest -v shell_sort.py
|
|
||||||
|
|
||||||
For manual testing run:
|
|
||||||
python shell_sort.py
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,26 +11,29 @@ def shell_sort(collection):
|
||||||
|
|
||||||
>>> shell_sort([0, 5, 3, 2, 2])
|
>>> shell_sort([0, 5, 3, 2, 2])
|
||||||
[0, 2, 2, 3, 5]
|
[0, 2, 2, 3, 5]
|
||||||
|
|
||||||
>>> shell_sort([])
|
>>> shell_sort([])
|
||||||
[]
|
[]
|
||||||
|
|
||||||
>>> shell_sort([-2, -5, -45])
|
>>> shell_sort([-2, -5, -45])
|
||||||
[-45, -5, -2]
|
[-45, -5, -2]
|
||||||
"""
|
"""
|
||||||
# Marcin Ciura's gap sequence
|
# Marcin Ciura's gap sequence
|
||||||
gaps = [701, 301, 132, 57, 23, 10, 4, 1]
|
|
||||||
|
|
||||||
|
gaps = [701, 301, 132, 57, 23, 10, 4, 1]
|
||||||
for gap in gaps:
|
for gap in gaps:
|
||||||
for i in range(gap, len(collection)):
|
for i in range(gap, len(collection)):
|
||||||
|
insert_value = collection[i]
|
||||||
j = i
|
j = i
|
||||||
while j >= gap and collection[j] < collection[j - gap]:
|
while j >= gap and collection[j - gap] > insert_value:
|
||||||
collection[j], collection[j - gap] = collection[j - gap], collection[j]
|
collection[j] = collection[j - gap]
|
||||||
j -= gap
|
j -= gap
|
||||||
|
collection[j] = insert_value
|
||||||
return collection
|
return collection
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
from doctest import testmod
|
||||||
|
|
||||||
|
testmod()
|
||||||
user_input = input("Enter numbers separated by a comma:\n").strip()
|
user_input = input("Enter numbers separated by a comma:\n").strip()
|
||||||
unsorted = [int(item) for item in user_input.split(",")]
|
unsorted = [int(item) for item in user_input.split(",")]
|
||||||
print(shell_sort(unsorted))
|
print(shell_sort(unsorted))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user