examples/quicksort.py
author Eugen Sawin <sawine@me73.com>
Tue, 08 Mar 2011 21:14:18 +0100
changeset 13 eaa3e0198a89
permissions -rw-r--r--
Added complete fs.
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()