在Python中实现中值选择算法的中位数

时间:2012-11-15 04:40:21

标签: python algorithm sorting

好。我放弃。我一直在努力实现中位数算法的中位数,但我不断给出错误的结果。我知道下面有很多代码,但我找不到我的错误,每个代码块都有一个相当的流程设计。 Quicksort是我用来从中位数枢轴选择的中位数得到的中位数。应该是一个简单的快速实施方案。 getMean只返回给定列表的平均值。

getPivot是我用来选择枢轴的方法。它遍历列表,一次取5个整数,找到那些整数的平均值,将该平均值放入列表c,然后找到c的中值。这是我用于dSelect算法的支点。

dSelect算法理论上很简单。当列表长度为1项时,基本案例返回一个项目。否则,就像在quickSort中一样,我遍历列表。如果我当前所在的数字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)

1 个答案:

答案 0 :(得分:1)

最大的问题是这一行:

i = (length + 1)/2

如果list = [1,2,3,4,5,6,7],答案应为4,即list [3]。您的版本如下所示:

i = (7 + 1) / 2

所以我等于4而不是3.甚至长度列表部分的类似问题虽然这不应该是一个大问题。