Реализация быстрой сортировки в Python [конкретные сбои ввода]

Я пишу код алгоритма quick_sort. Это код, который, насколько мне известно, должен работать и работает для большинства массивов, но не работает с [5, 3, 9, 8, 6] и выдает IndexError: индекс списка вне допустимого диапазона.

def quick_sort_array(A):
    return quick_sort(A, 0, len(A)-1)

def quick_sort(A, l, r):
    if l < r:
        pivot = A[l]
        left = l + 1
        right = r
        while left <= right:
            while A[left] <= pivot:
                left += 1
            while A[right] >= pivot and left <= right:
                right -= 1
            if left <= right:
                tmp = A[left]
                A[left] = A[right]
                A[right] = tmp
        A[l] = A[right]
        A[right] = pivot

        quick_sort(A, l, right-1)
        quick_sort(A, right+1, r)

Не могли бы вы помочь мне понять это? Спасибо

Сообщение об ошибке: Реализация быстрой сортировки в Python [конкретные сбои ввода]

В вызове, который завершается ошибкой, каковы значения параметров? Это должно позволить вам быстро найти ошибку. Кроме того, попробуйте найти видеоруководство, показывающее, как выполнять код с помощью отладчика.

Ulrich Eckhardt 20.03.2022 23:06

Спасибо @Ulrich, это тоже помогает.

Shreyas Sarda 23.03.2022 12:58
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша реализация этапа разделения быстрой сортировки дает сбой, когда стержень является самым большим элементом между началом части списка, который вы разбиваете на разделы, и концом списка. Цикл while, который увеличивает left, может продолжаться до тех пор, пока не выйдет за конец списка.

Чтобы решить эту проблему, вам нужно остановить первый внутренний цикл от прохождения right, точно так же, как вы уже предотвращаете right слишком далекое прохождение left. Я не проверял точно, какое граничное условие вы хотите, но простое копирование из второго внутреннего цикла, вероятно, сработает:

        while A[left] <= pivot and left <= right:
            left += 1
        while A[right] >= pivot and left <= right:
            right -= 1

Другие вопросы по теме