Главная страница
Навигация по странице:

  • СОРТИРОВКА ПРОСТЫМИ ВСТАВКАМИ

  • СОРТИРОВКА ПРОСТЫМИ ВСТАВКАМИ С БИНАРНЫМ ПОИСКОМ

  • Сортировка простыми вставками. Доклад. Сортировка вставками


    Скачать 50.55 Kb.
    НазваниеСортировка вставками
    АнкорСортировка простыми вставками
    Дата19.11.2020
    Размер50.55 Kb.
    Формат файлаdocx
    Имя файлаДоклад.docx
    ТипДокументы
    #151977

    СОРТИРОВКА ВСТАВКАМИ

    Для начала я расскажу о сортировке вставками.

    Общая суть сортировок вставками такова:

    1. Перебираются элементы в неотсортированной части массива.

    2. Каждый элемент вставляется в отсортированную часть массива на то место, где он должен находиться.

    То есть, сортировки вставками всегда делят массив на 2 части — отсортированную и неотсортированную. Из неотсортированной части извлекается любой элемент. Поскольку другая часть массива отсортирована, то в ней достаточно быстро можно найти своё место для этого извлечённого элемента. Элемент вставляется куда нужно, в результате чего отсортированная часть массива увеличивается, а неотсортированная уменьшается. По такому принципу работают все сортировки вставками.

    Звучит просто, но и в этом подходе есть свои сложности — вставка элемента в отсортированную часть массива. На самом деле это непросто и на какие только ухищрения не приходится идти, чтобы выполнить этот шаг.

    Теперь мы перейдем к самой сортировке простыми вставками.



    СОРТИРОВКА ПРОСТЫМИ ВСТАВКАМИ

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

    def insertion(data):

    for i in range(len(data)):

    j = i - 1

    key = data[i]

    while data[j] > key and j >= 0:

    data[j + 1] = data[j]

    j -= 1

    dat[j + 1] = key

    return data

    На примере простых вставок показательно смотрится главное преимущество большинства сортировок вставками, а именно — очень быстрая обработка почти упорядоченных массивов.

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

    Этому способствует сама основная идея этого класса — переброска элементов из неотсортированной части массива в отсортированную. При близком расположении близких по величине данных место вставки обычно находится близко к краю отсортированной части, что позволяет вставлять с наименьшими накладными расходами.

    Нет ничего лучше для обработки почти упорядоченных массивов чем сортировки вставками. Когда Вы где-то встречаете информацию, что лучшая временная сложность сортировки вставками равна O(n), то, скорее всего, имеются в виду ситуации с почти упорядоченными массивами.

    СОРТИРОВКА ПРОСТЫМИ ВСТАВКАМИ

    С БИНАРНЫМ ПОИСКОМ

    Так как место для вставки ищется в отсортированной части массива, то идея использовать бинарный поиск напрашивается сама собой. Другое дело, что поиск места вставки не является критичным для временной сложности алгоритма (главный пожиратель ресурсов — этап самой вставки элемента в найденную позицию), поэтому данная оптимизация здесь мало что даёт.

    А в случае почти отсортированного массива бинарный поиск может работать даже медленнее, поскольку он начинает с середины отсортированного участка, который, скорее всего, будет находиться слишком далеко от точки вставки (а на обычный перебор от позиции элемента до точки вставки уйдёт меньше шагов, если данные в массиве в целом упорядочены).

    def insertion_binary(data):

    for i in range(len(data)):

    key = data[i]

    lo, hi = 0, i - 1

    while lo < hi:

    mid = lo + (hi - lo) // 2

    if key < data[mid]:

    hi = mid

    else:

    lo = mid + 1

    for j in range(i, lo + 1, -1):

    data[j] = data[j - 1]

    data[lo] = key

    return data

    В защиту бинарного поиска отмечу, что он может сказать решающее слово в эффективности других сортировок вставками. Благодаря ему, в частности, на среднюю сложность по времени O(n log n) выходят такие алгоритмы как сортировка библиотекаря и пасьянсная сортировка. Но про них позже.


    написать администратору сайта