Ну, некоторые вещи были неправильными:
- Вы должны возвращать результаты рекурсивным методом в каждом случае!
- Когда j
Я также изменил несколько вещей, таких как бесполезные параметры или для циклов, которые можно записать с помощью слайсов.
Вот последнийкод, проверьте изменения, чтобы убедиться, что вы его понимаете.
RSelect:
def RSelect(array, statistic_order):
""" list * int * int
statistic_order = the i th element i'm searching for """
n = len(array)
if n == 1:
return array[0]
array_temp = array # Allows to have a shuffled list and
shuffle(array_temp)
pivot = array_temp[0] # Allows to have a random pivot
array = partition(array,0,n,pivot) # Changes here, does not impact the result, but for readability
j = array.index(pivot)
# print(array, j, statistic_order, end = '\t')
if j == statistic_order:
return pivot
elif j > statistic_order:
assert j > 0
# print((array[0:j]), pivot)
return RSelect(array[0:j],statistic_order) # Changes here : return
elif j < statistic_order:
assert j+1 < n
# print(pivot, (array[j+1:n]))
return RSelect(array[j+1:n],statistic_order-j-1) # Changes here : return, -j-1
main:
if __name__ == "__main__":
from sys import argv
if len(argv) > 1:
n = int(argv[1])
arr = [2, 1, 3, 5, 4]
print(RSelect(arr[:], n))
Существует другой алгоритм, также в O (n) для этой цели: см. this
EDIT: исправлены опечатки и исправлены сложности