Skip to content

Commit 1a27f00

Browse files
R055Acclausspre-commit-ci[bot]
authored andcommitted
Consolidate bubble sort iterative and recursive (TheAlgorithms#10651)
* Consolidate bubble sort iterative and recursive * Update sorts/bubble_sort.py Co-authored-by: Christian Clauss <[email protected]> * Refactor bubble sort func signature, doctest, timer * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update bubble_sort.py --------- Co-authored-by: Christian Clauss <[email protected]> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 3b95c49 commit 1a27f00

File tree

2 files changed

+92
-59
lines changed

2 files changed

+92
-59
lines changed

Diff for: sorts/bubble_sort.py

+92-17
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,45 @@
11
from typing import Any
22

33

4-
def bubble_sort(collection: list[Any]) -> list[Any]:
4+
def bubble_sort_iterative(collection: list[Any]) -> list[Any]:
55
"""Pure implementation of bubble sort algorithm in Python
66
77
:param collection: some mutable ordered collection with heterogeneous
88
comparable items inside
99
:return: the same collection ordered by ascending
1010
1111
Examples:
12-
>>> bubble_sort([0, 5, 2, 3, 2])
12+
>>> bubble_sort_iterative([0, 5, 2, 3, 2])
1313
[0, 2, 2, 3, 5]
14-
>>> bubble_sort([0, 5, 2, 3, 2]) == sorted([0, 5, 2, 3, 2])
14+
>>> bubble_sort_iterative([])
15+
[]
16+
>>> bubble_sort_iterative([-2, -45, -5])
17+
[-45, -5, -2]
18+
>>> bubble_sort_iterative([-23, 0, 6, -4, 34])
19+
[-23, -4, 0, 6, 34]
20+
>>> bubble_sort_iterative([0, 5, 2, 3, 2]) == sorted([0, 5, 2, 3, 2])
1521
True
16-
>>> bubble_sort([]) == sorted([])
22+
>>> bubble_sort_iterative([]) == sorted([])
1723
True
18-
>>> bubble_sort([-2, -45, -5]) == sorted([-2, -45, -5])
24+
>>> bubble_sort_iterative([-2, -45, -5]) == sorted([-2, -45, -5])
1925
True
20-
>>> bubble_sort([-23, 0, 6, -4, 34]) == sorted([-23, 0, 6, -4, 34])
26+
>>> bubble_sort_iterative([-23, 0, 6, -4, 34]) == sorted([-23, 0, 6, -4, 34])
2127
True
22-
>>> bubble_sort(['d', 'a', 'b', 'e', 'c']) == sorted(['d', 'a', 'b', 'e', 'c'])
28+
>>> bubble_sort_iterative(['d', 'a', 'b', 'e']) == sorted(['d', 'a', 'b', 'e'])
2329
True
30+
>>> bubble_sort_iterative(['z', 'a', 'y', 'b', 'x', 'c'])
31+
['a', 'b', 'c', 'x', 'y', 'z']
32+
>>> bubble_sort_iterative([1.1, 3.3, 5.5, 7.7, 2.2, 4.4, 6.6])
33+
[1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7]
34+
>>> bubble_sort_iterative([1, 3.3, 5, 7.7, 2, 4.4, 6])
35+
[1, 2, 3.3, 4.4, 5, 6, 7.7]
2436
>>> import random
25-
>>> collection = random.sample(range(-50, 50), 100)
26-
>>> bubble_sort(collection) == sorted(collection)
37+
>>> collection_arg = random.sample(range(-50, 50), 100)
38+
>>> bubble_sort_iterative(collection_arg) == sorted(collection_arg)
2739
True
2840
>>> import string
29-
>>> collection = random.choices(string.ascii_letters + string.digits, k=100)
30-
>>> bubble_sort(collection) == sorted(collection)
41+
>>> collection_arg = random.choices(string.ascii_letters + string.digits, k=100)
42+
>>> bubble_sort_iterative(collection_arg) == sorted(collection_arg)
3143
True
3244
"""
3345
length = len(collection)
@@ -42,14 +54,77 @@ def bubble_sort(collection: list[Any]) -> list[Any]:
4254
return collection
4355

4456

57+
def bubble_sort_recursive(collection: list[Any]) -> list[Any]:
58+
"""It is similar iterative bubble sort but recursive.
59+
60+
:param collection: mutable ordered sequence of elements
61+
:return: the same list in ascending order
62+
63+
Examples:
64+
>>> bubble_sort_recursive([0, 5, 2, 3, 2])
65+
[0, 2, 2, 3, 5]
66+
>>> bubble_sort_iterative([])
67+
[]
68+
>>> bubble_sort_recursive([-2, -45, -5])
69+
[-45, -5, -2]
70+
>>> bubble_sort_recursive([-23, 0, 6, -4, 34])
71+
[-23, -4, 0, 6, 34]
72+
>>> bubble_sort_recursive([0, 5, 2, 3, 2]) == sorted([0, 5, 2, 3, 2])
73+
True
74+
>>> bubble_sort_recursive([]) == sorted([])
75+
True
76+
>>> bubble_sort_recursive([-2, -45, -5]) == sorted([-2, -45, -5])
77+
True
78+
>>> bubble_sort_recursive([-23, 0, 6, -4, 34]) == sorted([-23, 0, 6, -4, 34])
79+
True
80+
>>> bubble_sort_recursive(['d', 'a', 'b', 'e']) == sorted(['d', 'a', 'b', 'e'])
81+
True
82+
>>> bubble_sort_recursive(['z', 'a', 'y', 'b', 'x', 'c'])
83+
['a', 'b', 'c', 'x', 'y', 'z']
84+
>>> bubble_sort_recursive([1.1, 3.3, 5.5, 7.7, 2.2, 4.4, 6.6])
85+
[1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7]
86+
>>> bubble_sort_recursive([1, 3.3, 5, 7.7, 2, 4.4, 6])
87+
[1, 2, 3.3, 4.4, 5, 6, 7.7]
88+
>>> import random
89+
>>> collection_arg = random.sample(range(-50, 50), 100)
90+
>>> bubble_sort_recursive(collection_arg) == sorted(collection_arg)
91+
True
92+
>>> import string
93+
>>> collection_arg = random.choices(string.ascii_letters + string.digits, k=100)
94+
>>> bubble_sort_recursive(collection_arg) == sorted(collection_arg)
95+
True
96+
"""
97+
length = len(collection)
98+
swapped = False
99+
for i in range(length - 1):
100+
if collection[i] > collection[i + 1]:
101+
collection[i], collection[i + 1] = collection[i + 1], collection[i]
102+
swapped = True
103+
104+
return collection if not swapped else bubble_sort_recursive(collection)
105+
106+
45107
if __name__ == "__main__":
46108
import doctest
47-
import time
109+
from random import sample
110+
from timeit import timeit
48111

49112
doctest.testmod()
50113

51-
user_input = input("Enter numbers separated by a comma:").strip()
52-
unsorted = [int(item) for item in user_input.split(",")]
53-
start = time.process_time()
54-
print(*bubble_sort(unsorted), sep=",")
55-
print(f"Processing time: {(time.process_time() - start)%1e9 + 7}")
114+
# Benchmark: Iterative seems slightly faster than recursive.
115+
num_runs = 10_000
116+
unsorted = sample(range(-50, 50), 100)
117+
timer_iterative = timeit(
118+
"bubble_sort_iterative(unsorted[:])", globals=globals(), number=num_runs
119+
)
120+
print("\nIterative bubble sort:")
121+
print(*bubble_sort_iterative(unsorted), sep=",")
122+
print(f"Processing time (iterative): {timer_iterative:.5f}s for {num_runs:,} runs")
123+
124+
unsorted = sample(range(-50, 50), 100)
125+
timer_recursive = timeit(
126+
"bubble_sort_recursive(unsorted[:])", globals=globals(), number=num_runs
127+
)
128+
print("\nRecursive bubble sort:")
129+
print(*bubble_sort_recursive(unsorted), sep=",")
130+
print(f"Processing time (recursive): {timer_recursive:.5f}s for {num_runs:,} runs")

Diff for: sorts/recursive_bubble_sort.py

-42
This file was deleted.

0 commit comments

Comments
 (0)