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