Quick actions

cmd+k|ctrl+k

Navigation

Languages

quicksorts

Snippet info

Language

Python

Visibility

public

Author

gelliott181

Created

2015-10-07T17:29:21Z

Updated

2015-10-07T17:29:21Z

import random
import timeit
import sys
import resource

def quicksort_first(lst, start, end):
    comparisons = 0
    if start < end:
        pivot = start
        lst[end], lst[pivot] = lst[pivot], lst[end]
        
        p, comparisons = partition_first(lst, start, end)
        quicksort_rand(lst, start, p - 1)
        quicksort_rand(lst, p + 1, end)
    return comparisons

def partition_first(lst, start, end):
    pivot = start
    comparisons = 0
    
    lst[end], lst[pivot] = lst[pivot], lst[end]
    
    pivot_index = start - 1
    
    for index in range(start, end):
        comparisons += 1
        if lst[index] < lst[end]:
            pivot_index += 1
            lst[index], lst[pivot_index] = lst[pivot_index], lst[index]
    
    pivot_index += 1
    lst[end], lst[pivot_index] = lst[pivot_index], lst[end]
    return pivot_index, comparisons
    
def quicksort_last(lst, start, end):
    comparisons = 0
    if start < end:
        pivot = end
        lst[end], lst[pivot] = lst[pivot], lst[end]
        
        p, comparisons = partition_first(lst, start, end)
        quicksort_rand(lst, start, p - 1)
        quicksort_rand(lst, p + 1, end)
    return comparisons

def partition_last(lst, start, end):
    pivot = end
    comparisons = 0
    
    lst[end], lst[pivot] = lst[pivot], lst[end]
    
    pivot_index = start - 1
    
    for index in range(start, end):
        comparisons += 1
        if lst[index] < lst[end]:
            pivot_index += 1
            lst[index], lst[pivot_index] = lst[pivot_index], lst[index]
    
    pivot_index += 1
    lst[end], lst[pivot_index] = lst[pivot_index], lst[end]
    return pivot_index, comparisons

def quicksort_mid(lst, start, end):
    comparisons = 0
    if start < end:
        pivot = int((start + end) / 2)
        lst[end], lst[pivot] = lst[pivot], lst[end]
        
        p, comparisons = partition_first(lst, start, end)
        quicksort_rand(lst, start, p - 1)
        quicksort_rand(lst, p + 1, end)
    return comparisons

def partition_mid(lst, start, end):
    pivot = int((start + end) / 2)
    comparisons = 0
    
    lst[end], lst[pivot] = lst[pivot], lst[end]
    
    pivot_index = start - 1
    
    for index in range(start, end):
        comparisons += 1
        if lst[index] < lst[end]:
            pivot_index += 1
            lst[index], lst[pivot_index] = lst[pivot_index], lst[index]
    
    pivot_index += 1
    lst[end], lst[pivot_index] = lst[pivot_index], lst[end]
    return pivot_index, comparisons
    
def quicksort_rand(lst, start, end):
    comparisons = 0
    if start < end:
        pivot = random.randint(start, end)
        lst[end], lst[pivot] = lst[pivot], lst[end]
        
        p, comparisons = partition_rand(lst, start, end)
        quicksort_rand(lst, start, p - 1)
        quicksort_rand(lst, p + 1, end)
        

    return comparisons
        
def partition_rand(lst, start, end):
    pivot = random.randint(start, end)
    comparisons = 0
    
    lst[end], lst[pivot] = lst[pivot], lst[end]
    
    pivot_index = start - 1
    
    for index in range(start, end):
        comparisons += 1
        if lst[index] < lst[end]:
            pivot_index += 1
            lst[index], lst[pivot_index] = lst[pivot_index], lst[index]
    
    pivot_index += 1
    lst[end], lst[pivot_index] = lst[pivot_index], lst[end]
    return pivot_index, comparisons
    
def analysis():
    size = 0
    elements = [20000, 40000]
    def quicksort_rand_analysis():
        lst = [random.randrange(0, 1000, 1) for _ in range(size)]
        comparisons = quicksort_rand(lst, 0, len(lst) - 1)
        print(comparisons, end=", ")
        
    def quicksort_first_analysis():
        lst = [random.randrange(0, 1000, 1) for _ in range(size)]
        comparisons = quicksort_first(lst, 0, len(lst) - 1)
        print(comparisons, end=", ")
        
    def quicksort_last_analysis():
        lst = [random.randrange(0, 1000, 1) for _ in range(size)]
        comparisons = quicksort_last(lst, 0, len(lst) - 1)
        print(comparisons, end=", ")
        
    def quicksort_mid_analysis():
        lst = [random.randrange(0, 1000, 1) for _ in range(size)]
        comparisons = quicksort_mid(lst, 0, len(lst) - 1)
        print(comparisons, end=", ")
    
    for size in elements:
        print(size, end=", ")
        time = timeit.timeit(quicksort_rand_analysis, number = 1)
        print(time / 10**-6)
        
        print(size, end=", ")
        time = timeit.timeit(quicksort_first_analysis, number = 1)
        print(time / 10**-6)
        
        print(size, end=", ")
        time = timeit.timeit(quicksort_last_analysis, number = 1)
        print(time / 10**-6)
        
        print(size, end=", ")
        time = timeit.timeit(quicksort_mid_analysis, number = 1)
        print(time / 10**-6)
    
if __name__ == "__main__":
    analysis()
INFO