QuickSort - Медиана Три - PullRequest
       18

QuickSort - Медиана Три

0 голосов
/ 17 ноября 2018

Я работаю над алгоритмом QuickSort - Median Three.У меня нет проблем с сортировкой первого и последнего элемента.Но когда доходит до Медианы-три, я слегка растерялся.Я надеюсь, что кто-то может помочь мне в этом.

Был бы признателен, если бы кто-то мог предоставить мне какой-нибудь псевдокод?

Я понимаю, что получая средний индекс, делая это.(начало + конец) / 2, а затем поменять значение среднего центра на первое значение, после того, как все это сделано, оно должно хорошо сочетаться с обычной быстрой сортировкой (разбиением и сортировкой).

Почему-то я не смогполучить это работает.Пожалуйста, помогите!

#Array Swap function
def swap(A,i,k):
    temp=A[i]
    A[i]=A[k]
    A[k]=temp

# Get Middle pivot function    
def middle(lista):
    if len(lista) % 2 == 0:
        result=  len(lista) // 2 - 1
    else:
        result =  len(lista)  // 2
    return result

def median(lista):
    if len(lista) % 2 == 0:
        return sorted(lista)[len(lista) // 2 - 1]
    else:
        return sorted(lista)[len(lista) // 2]


# Create partition function
def partition(A,start,end):

    m = middle(A[start:end+1])
    medianThree = [ A[start], A[m], A[end] ]

    if A[start] == median(medianThree):

       pivot_pos = start

    elif A[m] == median(medianThree):
       tempList = A[start:end+1]
       pivot_pos = middle(A[start:end+1])
       swap(A,start,pivot_pos+start)

    elif A[end] == median(medianThree):

       pivot_pos = end



    #pivot = A[pivot_pos]
    pivot = pivot_pos
    # swap(A,start,end) // This line of code is to switch the first and last element pivot
    swap(A,pivot,end)
    p = A[pivot]
    i = pivot + 1
    for j in range(pivot+1,end+1):
        if A[j] < p:
            swap(A,i,j)
            i+=1
    swap(A,start,i-1)
    return i-1


count = 0
#Quick sort algorithm
def quickSort(A,start,end):
    global tot_comparisons

    if start < end:
       # This to create the partition based on the 
       pivot_pos = partition(A,start,end)
       tot_comparisons += len(A[start:pivot_pos-1]) + len(A[pivot_pos+1:end])
       # This to sort the the left partition
       quickSort(A,start,pivot_pos -1)
       #This to sort the right partition
       quickSort(A,pivot_pos+1,end)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...