11from 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+
45107if __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 ("\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