1
1
from typing import Any
2
2
3
3
4
- def bubble_sort (collection : list [Any ]) -> list [Any ]:
4
+ def bubble_sort_iterative (collection : list [Any ]) -> list [Any ]:
5
5
"""Pure implementation of bubble sort algorithm in Python
6
6
7
7
:param collection: some mutable ordered collection with heterogeneous
8
8
comparable items inside
9
9
:return: the same collection ordered by ascending
10
10
11
11
Examples:
12
- >>> bubble_sort ([0, 5, 2, 3, 2])
12
+ >>> bubble_sort_iterative ([0, 5, 2, 3, 2])
13
13
[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])
15
21
True
16
- >>> bubble_sort ([]) == sorted([])
22
+ >>> bubble_sort_iterative ([]) == sorted([])
17
23
True
18
- >>> bubble_sort ([-2, -45, -5]) == sorted([-2, -45, -5])
24
+ >>> bubble_sort_iterative ([-2, -45, -5]) == sorted([-2, -45, -5])
19
25
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])
21
27
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'])
23
29
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]
24
36
>>> 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 )
27
39
True
28
40
>>> 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 )
31
43
True
32
44
"""
33
45
length = len (collection )
@@ -42,14 +54,77 @@ def bubble_sort(collection: list[Any]) -> list[Any]:
42
54
return collection
43
55
44
56
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
+
45
107
if __name__ == "__main__" :
46
108
import doctest
47
- import time
109
+ from random import sample
110
+ from timeit import timeit
48
111
49
112
doctest .testmod ()
50
113
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 ("\n Iterative 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 ("\n Recursive bubble sort:" )
129
+ print (* bubble_sort_recursive (unsorted ), sep = "," )
130
+ print (f"Processing time (recursive): { timer_recursive :.5f} s for { num_runs :,} runs" )
0 commit comments