中值选择算法中值的Python实现

中值选择算法中值的Python实现,python,algorithm,sorting,Python,Algorithm,Sorting,好的。我放弃了。我一直在尝试实现中值算法,但我不断得到错误的结果。我知道下面有很多代码,但我找不到我的错误,而且每一段代码都有一个相当合理的流程设计。快速排序是我用来对从中位数轴心选择中得到的中位数进行排序的方法。应该是一个简单的快速排序实现。getMean只返回给定列表的平均值 getPivot是我用来选择pivot的工具。它遍历列表,每次取5个整数,求出这些整数的平均值,将平均值放入列表c,然后求出c的中值。这就是我用于dSelect算法的轴心 dSelect算法在理论上很简单。当列表长度为

好的。我放弃了。我一直在尝试实现中值算法,但我不断得到错误的结果。我知道下面有很多代码,但我找不到我的错误,而且每一段代码都有一个相当合理的流程设计。快速排序是我用来对从中位数轴心选择中得到的中位数进行排序的方法。应该是一个简单的快速排序实现。getMean只返回给定列表的平均值

getPivot是我用来选择pivot的工具。它遍历列表,每次取5个整数,求出这些整数的平均值,将平均值放入列表c,然后求出c的中值。这就是我用于dSelect算法的轴心

dSelect算法在理论上很简单。当列表长度为1项时,基本大小写返回一项。否则,就像在快速排序中一样,我迭代列表。如果我当前所在的数字j小于轴,我将其移动到列表I的左侧,并增加I。如果它更大,我将它移动到列表的右侧,I+1,并且不增加I。在循环遍历整个列表之后,我应该将pivot放在其适当的索引中,并且print语句表明我这样做了。在这一点上,根据轴是否大于或小于我试图找到的位置,我将递归到左侧或右侧

我不确定在这一点上还需要测试哪些打印语句,所以我将求助于任何有足够精力尝试这段代码的人。我知道有相关的话题,我知道我可以做更多的书面陈述,但相信我,我已经尝试过了。什么应该是一个简单的算法让我很困惑

def quickSort(m, left, right):
    if right - left <= 1:
        return m
    pivot = m[left]
    i = left + 1
    j = left + 1
    for j in range(j, right):
        if m[j] < pivot:
            m[j], m[i] = m[i], m[j]
            i += 1
        elif m[j] == pivot:
            m[j], m[i] = m[i], m[j]
    print m
    m[left], m[i-1] = m[i-1], m[left]
    m = quickSort(m, left, i-1)
    m = quickSort(m, i, right)
    print m
    return m
def getMedian(list):
    length = len(list)
    if length <= 1:
        return list[0]
    elif length % 2 == 0:
        i = length/2
        return list[i]
    else:
        i = (length + 1)/2
        return list[i]
def getPivot(m):
    c = []
    i = 0
    while i <= len(m) - 1:
        tempList = []
        j = 0
        while j < 5 and i <= len(m) - 1:
            tempList.append(m[i])
            i = i + 1
            j = j + 1
        tempList = quickSort(tempList, 0, len(tempList) - 1)
        c.append(getMedian(tempList))
    c = quickSort(c, 0, len(c) - 1)
    medianOfMedians = getMedian(c)
    return medianOfMedians

def dSelect(m, position):
    pivot = getPivot(m)
    i = 0
    j = 0
    if len(m) <= 1:
        return m[0]
    for j in range(0, len(m)):
        if m[j] < pivot:
            m[j], m[i] = m[i], m[j]
            i += 1
        elif m[j] == pivot:
            m[j], m[i] = m[i], m[j]
        print "i: " + str(i)
        print "j: " + str(j)
    print "index of pivot: " + str(m.index(pivot))
    print "pivot: " + str(pivot) + " list: " + str(m)
    if m.index(pivot) == position:
        return pivot
    elif m.index(pivot) > position: 
        return dSelect(m[0:i], position)
    else:
        return dSelect(m[i:], position - i)
def快速排序(m、左、右):

如果右-左最大的问题是这一行:

i = (length + 1)/2
如果list=[1,2,3,4,5,6,7],那么答案应该是4,也就是list[3]。您的版本如下所示:

i = (7 + 1) / 2

所以我等于4,而不是3。偶数长度列表部分也存在类似的问题,尽管这不应该是一个大问题。

好的观点;忘记考虑零索引。但从这两个方程中减去一个似乎可以解决这一问题。然而,我仍然没有得到一个准确的结果后,改变…另一项我马上注意到的是,您的快速排序算法似乎不工作排序两个元素:定义快速排序(m,左,右):如果右-左