Squeak.ru - шаблоны программирования

Реализация python 3 median-of-3 Quicksort, которая переключается на heapsort после достижения предела глубины рекурсии

Вызываемые функции: (независимо от класса)

def partition( pivot, lst ):
    less, same, more = list(), list(), list()
    for val in lst:
        if val < pivot:
            less.append(val)
        elif val > pivot:
            more.append(val)
        else:
            same.append(val)
    return less, same, more


def medianOf3(lst):
"""
From a lst of unordered data, find and return the the median value from
the first, middle and last values.
"""
    finder=[]
    start=lst[0]
    mid=lst[len(lst)//2]
    end=lst[len(lst)-1]
    finder.append(start)
    finder.append(mid)
    finder.append(end)
    finder.sort()
    pivot_val=finder[1]
    return pivot_val

основной код

def quicheSortRec(lst,limit):
"""
A non in-place, depth limited quickSort, using median-of-3 pivot.
Once the limit drops to 0, it uses heapSort instead.
"""
    if limit==0:
        return heapSort.heapSort(lst)
    else:
        pivot=qsPivotMedian3.medianOf3(lst)        # here we select the first element as the pivot
        less, same, more = qsPivotMedian3.partition(pivot, lst)
        return quicheSortRec(less,limit-1) + same + quicheSortRec(more,limit-1)


def quicheSort(lst):
"""
The main routine called to do the sort.  It should call the
recursive routine with the correct values in order to perform
the sort
"""
    N=len(lst)
    end= int(math.log(N,2))
    if len(lst)==0:
        return list()
    else:
        return quicheSortRec(lst,end)

поэтому этот код должен брать список и сортировать его, используя медиану 3 реализации быстрой сортировки, до тех пор, пока он не достигнет предела рекурсии глубины, после чего функция вместо этого будет использовать heapsort. Результаты этого кода затем передаются в другая программа, предназначенная для тестирования алгоритма со списками длиной 1,10,100,1000,10000,100000.

однако, когда я запускаю код, он говорит мне, что длины 1 и 10 работают нормально, но после этого он выдает ошибку индекса списка за пределами границ для

start=lst[0] в медиане 3 функции

Я не могу понять, почему.


  • Пожалуйста, приведите конкретный пример списка, для которого возникает ошибка, который могут запустить другие люди. И если вы это сделаете, держу пари, вы сами найдете проблему ;-) 30.11.2013

Ответы:


1

Не видя ваших тестовых данных, мы летим вслепую. В общем,

less, same, more = qsPivotMedian3.partition(pivot, lst)

сам по себе хорош, но вы никогда не проверяете less или more, чтобы увидеть, пусты ли они. Даже если они пусты, они передаются через:

    return quicheSortRec(less,limit-1) + same + quicheSortRec(more,limit-1)

и quicheSortRec() также не проверяет, пусты ли они: он безоговорочно вызывает:

pivot=qsPivotMedian3.medianOf3(lst)  

и эта функция вызовет ошибку, которую вы видите, если она передала пустой список. Обратите внимание, что ваш quicheSort() делает проверку на наличие пустого ввода. Рекурсивная рабочая функция тоже должна.

Кстати, рассмотрите эту переработку medianOf3():

def medianOf3(lst):
    return sorted([lst[0], lst[len(lst)//2], lst[-1]])[1]

Это тот случай, когда краткость понятнее ;-)

30.11.2013
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...