Python 快速选择:什么&x27;怎么了?

Python 快速选择:什么&x27;怎么了?,python,algorithm,Python,Algorithm,我正在学习快速选择算法,但我的代码不起作用 def qselect(li, k): if len(li) <= 1: return li mid = len(li) // 2 pivot = li[mid] left, equal, right = [], [], [] for number in li: if number < pivot: left.append(number)

我正在学习快速选择算法,但我的代码不起作用

def qselect(li, k):
    if len(li) <= 1:
        return li

    mid = len(li) // 2
    pivot = li[mid]

    left, equal, right = [], [], []

    for number in li:
        if number < pivot:
            left.append(number)
        elif number > pivot:
            right.append(number)
        else:
            equal.append(number)

    if k < len(left):
        qselect(left, k)
        return left[k-1]
    elif k < len(left) + len(equal):
        return equal[0]
    else:
        qselect(right, k)
        return right[k - len(left) - len(equal)]

li = [2, 36, 5, 21, 8, 13, 11, 20, 5, 4, 1]
k = 8
print(qselect(li,k))
所以,我希望正确的[0]被打印出来


怎么了?

怎么了,你没有检查你要求的长度。调试此代码的第一件事是检查有问题的行中使用的值:

else:
    qselect(right, k)
    print("right", len(right))
    print(k, len(left), len(equal), k - len(left) - len(equal)) 
    return right[k - len(left) - len(equal)]
输出:

right 1
8 1 1 6
Traceback (most recent call last):
  File "C:\Users\wdwickar\AppData\Local\Programs\Python\Python38\ZZZ learning\so.py", line 31, in <module>
    print(qselect(li,k))
  File "C:\Users\wdwickar\AppData\Local\Programs\Python\Python38\ZZZ learning\so.py", line 24, in qselect
    qselect(right, k)
  File "C:\Users\wdwickar\AppData\Local\Programs\Python\Python38\ZZZ learning\so.py", line 27, in qselect
    return right[k - len(left) - len(equal)]
IndexError: list index out of range
右1
8 1 1 6
回溯(最近一次呼叫最后一次):
文件“C:\Users\wdwickar\AppData\Local\Programs\Python\Python38\ZZZ learning\so.py”,第31行,在
打印(qselect(li,k))
文件“C:\Users\wdwickar\AppData\Local\Programs\Python\Python38\ZZZ learning\so.py”,第24行,在qselect中
qselect(右,k)
文件“C:\Users\wdwickar\AppData\Local\Programs\Python\Python38\ZZZ learning\so.py”,第27行,在qselect中
向右返回[k-长度(左)-长度(相等)]
索引器:列表索引超出范围

请参阅此以获取进一步帮助。

您希望得到什么结果?我以为原始列表中的第8个元素“13”已经打印出来了@l'l'lYou已经定义了
k
超过列表索引
k=8
,它应该是
k=7
,因为索引从
0
开始。好吧,我有同样的想法,但它仍然返回相同的错误看一看:谢谢!我考虑过你的答案,但现在我想知道为什么len(右)和len(左)是1。我是否需要添加更多行以合并碎片列表?如果是这样,为什么第一个条件,如果kelse: qselect(right, k) print("right", len(right)) print(k, len(left), len(equal), k - len(left) - len(equal)) return right[k - len(left) - len(equal)]
right 1
8 1 1 6
Traceback (most recent call last):
  File "C:\Users\wdwickar\AppData\Local\Programs\Python\Python38\ZZZ learning\so.py", line 31, in <module>
    print(qselect(li,k))
  File "C:\Users\wdwickar\AppData\Local\Programs\Python\Python38\ZZZ learning\so.py", line 24, in qselect
    qselect(right, k)
  File "C:\Users\wdwickar\AppData\Local\Programs\Python\Python38\ZZZ learning\so.py", line 27, in qselect
    return right[k - len(left) - len(equal)]
IndexError: list index out of range