1
1
from __future__ import annotations
2
2
3
-
4
3
def partition (array : list , low : int , high : int ) -> int :
5
- """Helper function for quicksort to partition the array.
4
+ """
5
+ Helper function for quicksort to partition the array.
6
+
6
7
>>> array = [3, 2, 1]
7
- >>> partition(array, 0, len(array) - 1)
8
+ >>> idx = partition(array, 0, len(array) - 1)
9
+ >>> idx
8
10
0
9
11
>>> array
10
12
[1, 2, 3]
13
+
11
14
>>> array = [12, 4, 5, 2, 3]
12
15
>>> idx = partition(array, 0, len(array) - 1)
13
16
>>> array[:idx], array[idx], array[idx+1:]
14
17
([2, 3, 4], 5, [12])
18
+
19
+ >>> array = [2, 1]
20
+ >>> idx = partition(array, 0, len(array) - 1)
21
+ >>> array
22
+ [1, 2]
15
23
"""
16
24
pivot = array [high ]
17
25
i = low - 1 # Pointer for the smaller element
@@ -24,18 +32,38 @@ def partition(array: list, low: int, high: int) -> int:
24
32
array [i + 1 ], array [high ] = array [high ], array [i + 1 ]
25
33
return i + 1
26
34
27
-
28
35
def quicksort (array : list , low : int = 0 , high : int | None = None ) -> list :
36
+ """
37
+ Returns a sorted list using the quicksort algorithm.
38
+
39
+ >>> quicksort([-2, 3, -10, 11, 99, 100000, 100, -200])
40
+ [-200, -10, -2, 3, 11, 99, 100, 100000]
41
+
42
+ >>> quicksort([1, 2, 3, 4, 5])
43
+ [1, 2, 3, 4, 5]
44
+
45
+ >>> quicksort([5, 4, 3, 2, 1])
46
+ [1, 2, 3, 4, 5]
47
+
48
+ >>> quicksort([-200])
49
+ [-200]
50
+
51
+ >>> quicksort([])
52
+ []
53
+
54
+ >>> quicksort([10000000, 1, -1111111111, 101111111112, 9000002])
55
+ [-1111111111, 1, 9000002, 10000000, 101111111112]
56
+ """
29
57
if high is None :
30
58
high = len (array ) - 1
59
+
31
60
if low < high :
32
61
pivot_index = partition (array , low , high )
33
62
quicksort (array , low , pivot_index - 1 )
34
63
quicksort (array , pivot_index + 1 , high )
35
- return array
36
64
65
+ return array
37
66
38
67
if __name__ == "__main__" :
39
68
import doctest
40
-
41
69
doctest .testmod ()
0 commit comments