Search code examples
pythonalgorithmsortingquicksort

Median Of 3 Quicksort Function Not Working


I'm trying to get a median of three quicksort algorithm implemented in python but can't figure out what is wrong and why it's not working

from statistics import median

def Swap(arr, posA, posB):
    arr[posA], arr[posB] = arr[posB], arr[posA]

def Median(array):
    medianValue = median([array[0], array[int(len(array)/2)], array[-1]])
    return array.index(medianValue)

def Partition(array, start, end):
    pivot = array[end]
    i = start-1
    for j in range(start, end):
            if array[j] <= pivot:
                i += 1
                Swap(array, i, j)
    Swap(array, i+1, end)
    return i + 1

def Quicksort(array, startInd, endInd):
    if startInd < endInd:
        medianIndex = Median(array)
        Swap(array, medianIndex, endInd)
        pivot  = Partition(array, startInd, endInd)
        Quicksort(array, startInd, pivot  - 1)
        Quicksort(array, pivot  + 1, endInd)

Thanks for any help :)


Solution

  • the issue is that you are getting the median of three based off the whole array and not the sub-section that is being worked on. A possible fix would be:

    Change your Median function to:

    def Median(array, firstVal, middleVal, endVal):
        if (firstVal - middleVal) * (endVal - firstVal) >= 0:
            medianValue =  firstVal
    
        elif (middleVal - firstVal) * (endVal - middleVal) >= 0:
            medianValue = middleVal
    
        else:
            medianValue = endVal
    
        return array.index(medianValue)
    

    and then change your Quicksort function to

    def Quicksort(array, startInd, endInd):
        if startInd < endInd:
            # get median
            middleVal = (endInd + startInd) // 2
            medianIndex = Median(array, array[startInd], array[middleVal],
                array[endInd])
            #
            Swap(array, medianIndex, endInd)
            pivot  = Partition(array, startInd, endInd)
            Quicksort(array, startInd, pivot  - 1)
            Quicksort(array, pivot  + 1, endInd)