QuickSort-中位数三

时间:2018-11-17 07:54:44

标签: algorithm quicksort median

我正在研究QuickSort-中位数三算法。 我对第一个和最后一个元素排序没有问题。但是,当谈到中三时,我有些困惑。我希望有人可以帮助我。

如果有人可以提供一些伪代码,我将不胜感激?

我的理解是通过这样做来获得中间索引。 (开始+结束)/ 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)

0 个答案:

没有答案