Skip to content

Commit ebd530e

Browse files
authored
Create quicksort.py
adding quicksort under divide and conquer
1 parent e9e7c96 commit ebd530e

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

divide_and_conquer/quicksort.py

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

0 commit comments

Comments
 (0)