2012-11-14 7 views
0

У меня есть то, что должно быть простой реализацией quicksort, но она возвращает ошибку рекурсии, превышающую ошибку, и я тестирую ее в списке из менее чем 30 элементов. Более того, моя реализация работала над списком из 10 000 несколько дней назад, и единственное, что я изменил, это переместить его из класса в глобальную. Кто-нибудь видит, что может быть причиной этого?QuickSort Возвращаемая ошибка глубины рекурсии

def quickSort(m, left, right): 
    if len(m[left:right]) <= 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 
    m[left], m[i-1] = m[i-1], m[left] 
    m = quickSort(m, left, i) 
    m = quickSort(m, i, right) 
    return m 
+2

'для j в диапазоне (j, справа): 'это не может быть хорошим (для удобства чтения) – amit

+0

Добавьте несколько операторов печати и запустите их, чтобы увидеть, как они прогрессируют. –

ответ

2

один из ваших рекурсивных вызовов вызывает исключение (как вы уже догадались :-), также отметить, что сортирует список на месте, так возвращая список не является необходимым

def quickSort(m, left, right): 
    if right - left <= 1: 
     return 

    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 
    m[left], m[i-1] = m[i-1], m[left] 
    quickSort(m, left, i-1) 
    quickSort(m, i, right) 
+0

Yup, опорная точка должна быть исключена при сортировке суб-списка. Хороший, я пропустил это :) –

Смежные вопросы