1
+ import unittest
2
+
3
+
1
4
# sort a list of numbers
2
5
def quicksort (lst ):
3
- if len (lst )<= 1 :
4
- return lst
5
-
6
- pivot = lst [0 ]
7
- left ,right = partition (lst [1 :],pivot )
8
- return quicksort (left ) + [pivot ] + quicksort (right )
6
+ if len (lst ) <= 1 :
7
+ return lst
8
+
9
+ pivot = lst [0 ]
10
+ left , right = partition (lst [1 :], pivot )
11
+ return quicksort (left ) + [pivot ] + quicksort (right )
12
+
9
13
10
14
# lenght of lst is at least 1
11
- def partition (lst ,pivot ):
15
+ def partition (lst , pivot ):
12
16
left = 0
13
17
right = 0
14
18
while right != len (lst ):
15
19
if lst [right ] < pivot :
16
- lst [left ],lst [right ] = lst [right ],lst [left ]
20
+ lst [left ], lst [right ] = lst [right ], lst [left ]
17
21
left += 1
18
22
right += 1
19
- return lst [:left ],lst [left :]
23
+ return lst [:left ], lst [left :]
24
+
25
+
26
+ # the orginal lst remains unchanged after calling this method
27
+ def lomuto_quicksort_not_in_place (lst ):
28
+ if len (lst ) <= 1 :
29
+ return lst
30
+ pivot , lst1 , lst2 = lst [- 1 ], [], []
31
+ for e in lst [:- 1 ]:
32
+ if e <= pivot :
33
+ lst1 .append (e )
34
+ else :
35
+ lst2 .append (e )
36
+ sorted_lst1 = lomuto_quicksort_not_in_place (lst1 )
37
+ sorted_lst2 = lomuto_quicksort_not_in_place (lst2 )
38
+ return sorted_lst1 + [pivot ] + sorted_lst2
39
+
40
+
41
+ class TestQuicksort (unittest .TestCase ):
42
+ # return a list of tuples (lst_unsorted, expected)
43
+ def data_provider (self ):
44
+ return [
45
+ ([], []),
46
+ ([1 ], [1 ]),
47
+ ([1 , 2 ], [1 , 2 ]),
48
+ ([2 , 1 ], [1 , 2 ]),
49
+ ([3 , 2 , 1 ], [1 , 2 , 3 ]),
50
+ ([1 , 3 , 2 , 1 , 2 ], [1 , 1 , 2 , 2 , 3 ]),
51
+ ([6 , 0 , 8 , 8 , 8 , 6 , 7 , 3 , 3 , 6 ], [0 , 3 , 3 , 6 , 6 , 6 , 7 , 8 , 8 , 8 ]),
52
+ ]
53
+
54
+ # Date: 2015
55
+ def test_quicksort (self ):
56
+ for lst_unsorted , expected in self .data_provider ():
57
+ self .assertEqual (quicksort (lst_unsorted ), expected )
58
+
59
+ # Date: Nov 11, 2018
60
+ def test_lomuto_quicksort_not_in_place (self ):
61
+ for lst_unsorted , expected in self .data_provider ():
62
+ self .assertEqual (lomuto_quicksort_not_in_place (lst_unsorted ), expected )
20
63
21
64
22
65
if __name__ == '__main__' :
23
- print quicksort ([6 ,9 ,2 ,9 ,10 ,6 ])
24
- print quicksort ([2 ,1 ])
66
+ unittest .main ()
0 commit comments