3个快速排序函数的中值不起作用

2024-10-03 23:19:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图得到用python实现的三个快速排序算法的中间值,但无法找出问题所在以及它不起作用的原因

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)

谢谢你的帮助:)


Tags: defarraystartendmedianpivotarrswap
1条回答
网友
1楼 · 发布于 2024-10-03 23:19:04

问题是,您得到的是基于整个阵列的三个中位数,而不是正在处理的子部分。一个可能的解决办法是:

将中值函数更改为:

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)

然后将快速排序函数更改为

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)

相关问题 更多 >