55from typing import List
66import random
77
8+
89def quick_sort (a : List [int ]):
9- _quick_sort_between (a , 0 , len (a )- 1 )
10+ _quick_sort_between (a , 0 , len (a ) - 1 )
11+
1012
1113def _quick_sort_between (a : List [int ], low : int , high : int ):
12- if low >= high : return
13- # get a random position as the pivot
14- k = random .randint (low , high )
15- a [low ], a [k ] = a [k ], a [low ]
14+ if low < high :
15+ # get a random position as the pivot
16+ k = random .randint (low , high )
17+ a [low ], a [k ] = a [k ], a [low ]
18+
19+ m = _partition (a , low , high ) # a[m] is in final position
20+ _quick_sort_between (a , low , m - 1 )
21+ _quick_sort_between (a , m + 1 , high )
1622
17- m = _partition (a , low , high ) # a[m] is in final position
18- _quick_sort_between (a , low , m - 1 )
19- _quick_sort_between (a , m + 1 , high )
2023
2124def _partition (a : List [int ], low : int , high : int ):
2225 pivot , j = a [low ], low
23- for i in range (low + 1 , high + 1 ):
26+ for i in range (low + 1 , high + 1 ):
2427 if a [i ] <= pivot :
2528 j += 1
2629 a [j ], a [i ] = a [i ], a [j ] # swap
2730 a [low ], a [j ] = a [j ], a [low ]
2831 return j
2932
3033
34+ def test_quick_sort ():
35+ a1 = [3 , 5 , 6 , 7 , 8 ]
36+ quick_sort (a1 )
37+ assert a1 == [3 , 5 , 6 , 7 , 8 ]
38+ a2 = [2 , 2 , 2 , 2 ]
39+ quick_sort (a2 )
40+ assert a2 == [2 , 2 , 2 , 2 ]
41+ a3 = [4 , 3 , 2 , 1 ]
42+ quick_sort (a3 )
43+ assert a3 == [1 , 2 , 3 , 4 ]
44+ a4 = [5 , - 1 , 9 , 3 , 7 , 8 , 3 , - 2 , 9 ]
45+ quick_sort (a4 )
46+ assert a4 == [- 2 , - 1 , 3 , 3 , 5 , 7 , 8 , 9 , 9 ]
47+
48+
3149if __name__ == "__main__" :
3250 a1 = [3 , 5 , 6 , 7 , 8 ]
3351 a2 = [2 , 2 , 2 , 2 ]
@@ -40,4 +58,4 @@ def _partition(a: List[int], low: int, high: int):
4058 quick_sort (a3 )
4159 print (a3 )
4260 quick_sort (a4 )
43- print (a4 )
61+ print (a4 )
0 commit comments