Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 9875f37

Browse files
R055Acclausspre-commit-ci[bot]
authored
Consolidate bubble sort iterative and recursive (TheAlgorithms#10651)
* Consolidate bubble sort iterative and recursive * Update sorts/bubble_sort.py Co-authored-by: Christian Clauss <cclauss@me.com> * 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 <cclauss@me.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 34f48b6 commit 9875f37

File tree

2 files changed

+92
-59
lines changed

2 files changed

+92
-59
lines changed

‎sorts/bubble_sort.py‎

Lines changed: 92 additions & 17 deletions
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")

‎sorts/recursive_bubble_sort.py‎

Lines changed: 0 additions & 42 deletions
This file was deleted.

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /