sawine@2
|
1 |
"""
|
sawine@2
|
2 |
Name: quicksort - Quicksort for arrays of unsorted integers
|
sawine@2
|
3 |
|
sawine@2
|
4 |
Description: quicksort applies the Quicksort using static or randomised pivot element selection on an unsorted array of integers.
|
sawine@2
|
5 |
|
sawine@2
|
6 |
Author: Eugen Sawin <sawine@me73.com>
|
sawine@2
|
7 |
"""
|
sawine@2
|
8 |
|
sawine@2
|
9 |
def main():
|
sawine@2
|
10 |
args = parse_arguments()
|
sawine@2
|
11 |
array = [int(e.strip()) for e in args.array.split(',')]
|
sawine@2
|
12 |
random = args.r
|
sawine@2
|
13 |
print quicksort(array, random)
|
sawine@2
|
14 |
|
sawine@2
|
15 |
from random import randrange
|
sawine@2
|
16 |
|
sawine@2
|
17 |
def quicksort(array, random=False):
|
sawine@2
|
18 |
if len(array) < 2:
|
sawine@2
|
19 |
return array
|
sawine@2
|
20 |
if random:
|
sawine@2
|
21 |
p = randrange(len(array))
|
sawine@2
|
22 |
pivot = array[p]
|
sawine@2
|
23 |
array[p] = array[-1]
|
sawine@2
|
24 |
array[-1] = pivot
|
sawine@2
|
25 |
else:
|
sawine@2
|
26 |
pivot = array[-1]
|
sawine@2
|
27 |
left, right = partition(array, pivot)
|
sawine@2
|
28 |
left = quicksort(left, random)
|
sawine@2
|
29 |
right = quicksort(right, random)
|
sawine@2
|
30 |
print left + [pivot] + right
|
sawine@2
|
31 |
return left + [pivot] + right
|
sawine@2
|
32 |
|
sawine@2
|
33 |
def partition(array, pivot):
|
sawine@2
|
34 |
left = []
|
sawine@2
|
35 |
right = []
|
sawine@2
|
36 |
for e in array[:-1]:
|
sawine@2
|
37 |
if e < pivot:
|
sawine@2
|
38 |
left.append(e)
|
sawine@2
|
39 |
else:
|
sawine@2
|
40 |
right.append(e)
|
sawine@2
|
41 |
return left, right
|
sawine@2
|
42 |
|
sawine@2
|
43 |
from argparse import ArgumentParser
|
sawine@2
|
44 |
|
sawine@2
|
45 |
def parse_arguments():
|
sawine@2
|
46 |
parser = ArgumentParser(description='Applies Quicksort on an unsorted array of integers.')
|
sawine@2
|
47 |
parser.add_argument('array', help='comma-separated values')
|
sawine@2
|
48 |
parser.add_argument('-r', action='store_true', help='randomised pivot selection')
|
sawine@2
|
49 |
return parser.parse_args()
|
sawine@2
|
50 |
|
sawine@2
|
51 |
if __name__ == "__main__":
|
sawine@2
|
52 |
main()
|