Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kursovaya_rabota_Kirillova_Christina_8K21.doc
Скачиваний:
74
Добавлен:
29.05.2015
Размер:
840.19 Кб
Скачать
  1. Исследование эффективности алгоритмов сортировок для различных структур и размерностей данных

    1. Постановка задачи

  • Провести экспериментальный сравнительный анализ различных методов сортировки. Для чистоты эксперимента сортировка должна проводиться на одинаковых наборах входных данных, которые генерируются случайным образом. Для более полного анализа методов сортировка должна проводиться для различных размерностей данных, например: 500, 1000, 3000, 5000, 8000, 10000, 30000, 60000.

  • Исходные наборы данных – массивы или файлы соответствующего типа (по № варианта).

  • Проследить динамику роста требуемого для сортировки времени.

  • Проверить, как ведут себя методы на различных входных данных: упорядоченных в прямом порядке, упорядоченных в обратном порядке и случайных.

  • Сравнить теоретические оценки времени сортировки и числа требуемых операций с экспериментальными.

  • Построить соответствующие таблицы и графики сравнительного анализа различных методов сортировки (по времени, размерности и исходной упорядоченности)

  • Провести исследования o для выбранных алгоритмов внутренней сортировки (один из методов вставки и один из методов обменной сортировки)

Теоретические положения.

Сортировка- это процесс упорядочения некоторого множества элементов, на котором определены отношения порядка >, <, ≥, ≤.

Задачей сортировкиявляется преобразование исходной последовательности в последовательность, содержащую те же записи, но в порядке возрастания (или убывания) значений ключа.

Алгоритмы сортировки оцениваются по скорости выполнения и эффективности использования памяти:

  • Время— характеризует быстродействие алгоритма. Эквивалентно вычислительной сложности. Для типичного алгоритма средняя сложность — O(n log n) и высокая — O(n2). Идеальное поведение для упорядочения — O(n).

  • Память—временное хранение данных. Обычно эти алгоритмы требуют O(log n) памяти. Алгоритмы сортировки, которые не потребляют дополнительной памяти, относят к сортировкам на месте.

      1. Сортировка выбором

Самый простой алгоритм сортировок – это сортировка выбором. Судя по названию сортировки, необходимо что-то выбирать (максимальный или минимальный элементы массива). Алгоритм сортировки выбором находит в исходном массиве максимальный или минимальный элементы, в зависимости от того как необходимо сортировать массив, по возрастанию или по убыванию. Если массив должен быть отсортирован по возрастанию, то из исходного массива необходимо выбирать минимальные элементы. Если же массив необходимо отсортировать по убыванию, то выбирать следует максимальные элементы.

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

      1. Сортировка простыми обменами, сортировка пузырьком

 Для понимания и реализации этот алгоритм — простейший, но эффективен он лишь для небольших массивов. Сложность алгоритма:O(n²).

Метод сортировки обменами лежит в основе некоторых более совершенных алгоритмов, таких какшейкерная сортировка,пирамидальная сортировкаибыстрая сортировка.

Алгоритм состоит из повторяющихся проходов по сортируемому массиву. За каждый проход элементы последовательно сравниваются попарно и, если порядок в паре неверный, выполняется обмен элементов. Проходы по массиву повторяются N-1 раз или до тех пор, пока на очередном проходе не окажется, что обмены больше не нужны, что означает — массив отсортирован. При каждом проходе алгоритма по внутреннему циклу, очередной наибольший элемент массива ставится на своё место в конце массива рядом с предыдущим наибольшим элементом, а наименьший элемент перемещается на одну позицию к началу массива («всплывает» до нужной позиции как пузырёк в воде, отсюда и название алгоритма).

      1. Гномья сортировка

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

Алгоритм концептуально простой, не требует вложенных циклов. Время работы. На практике алгоритм может работать так же быстро, как и сортировка вставками.

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

      1. Сортировка вставками

Сортировка вставками — достаточно простой алгоритм. Массив делится на 2 части: отсортированную и неотсортированную. На каждом шаге берется очередной элемент из неотсортированной части и включается в отсортированную. Имеет высокую вычислительную сложность O(n²). Отсортировано начало массива A1, A2, ….,Ai-1. Остаток массива Ai,…An не отсортирован. На очередном шаге Ai включается в отсортированную часть на соответствующее место. Пример такой сортировки – сортировка с помощью двоичного дерева.

      1. Сортировка слиянием

Сортировка слиянием — алгоритм сортировки, который упорядочивает списки (или другие структуры данных, доступ к элементам которых можно получать только последовательно, например — потоки) в определённом порядке. Эта сортировка — хороший пример использования принципа «разделяй и властвуй». Сначала задача разбивается на несколько подзадач меньшего размера. Затем эти задачи решаются с помощью рекурсивного вызова или непосредственно, если их размер достаточно мал. Наконец, их решения комбинируются, и получается решение исходной задачи.

      1. Блочная сортировка

Блочная сортировка(Карманная сортировка, корзинная сортировка,англ.Bucket sort) —алгоритм сортировки, в котором сортируемые элементы распределяются между конечным числом отдельных блоков (карманов, корзин) так, чтобы все элементы в каждом следующем по порядку блоке были всегда больше (или меньше), чем в предыдущем. Каждый блок затем сортируется отдельно, либо рекурсивно тем же методом, либо другим. Затемэлементыпомещаются обратно вмассив. Этот тип сортировки может обладать линейным временем исполнения.

Преимущества: относится к классу быстрых алгоритмов с линейным временем исполнения O(N) (на удачных входных данных).

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

      1. Сортировка Шелла.

Данный метод заключается в том, что сравниваются элементы, стоящие не только рядом, но и на расстоянии друг от друга. Иными словами - сортировка вставками либо сортировка простыми обменами с предварительными «грубыми» проходами.

При данной сортировке сначала сравниваются и сортируются между собой ключи, отстоящие один от другого на некотором расстоянии d. После этого процедура повторяется для некоторых меньших значений d, а завершается сортировка Шелла упорядочиванием элементов при d = 1

Использованный мной собственный метод определения ключей d заключается в использовании эмпирической последовательности чисел, которая оптимально подошла бы для упорядочивания массивов разной длины.

      1. Быстрая сортировка

Быстрая сортировка использует стратегию «разделяй и властвуй». Шаги алгоритма таковы:

  1. Выбираем в массиве некоторый элемент, который будем называть опорным элементом. С точки зрения корректности алгоритма выбор опорного элемента безразличен. С точки зрения повышения эффективности алгоритма выбираться должна медиана, но без дополнительных сведений о сортируемых данных её обычно невозможно получить. Известные стратегии: выбирать постоянно один и тот же элемент, например, средний или последний по положению; выбирать элемент со случайно выбранным индексом.

  2. Операция разделения массива: реорганизуем массив таким образом, чтобы все элементы, меньшие или равные опорному элементу, оказались слева от него, а все элементы, большие опорного — справа от него. Обычный алгоритм операции:

    1. Два индекса — l и r, приравниваются к минимальному и максимальному индексу разделяемого массива соответственно.

    2. Вычисляется индекс опорного элемента m.

    3. Индекс l последовательно увеличивается до m до тех пор, пока l-й элемент не превысит опорный.

    4. Индекс r последовательно уменьшается до m до тех пор, пока r-й элемент не окажется меньше либо равен опорному.

    5. Если r = l — найдена середина массива — операция разделения закончена, оба индекса указывают на опорный элемент.

    6. Если l < r — найденную пару элементов нужно обменять местами и продолжить операцию разделения с тех значений l и r, которые были достигнуты. Следует учесть, что если какая-либо граница (l или r) дошла до опорного элемента, то при обмене значение m изменяется на r-й или l-й элемент соответственно.

  3. Рекурсивноупорядочиваем подмассивы, лежащие слева и справа от опорного элемента.

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

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

      1. Пирамидальная сортировка

Пи­ра­ми­да — дво­ич­ное де­ре­во, в ко­то­ром зна­че­ние каж­до­го эле­мен­та боль­ше ли­бо рав­но зна­че­ний до­чер­них эле­мен­тов.

За­пол­нив де­ре­во эле­мен­та­ми в про­из­воль­ном по­ряд­ке, мож­но лег­ко его от­сор­ти­ро­вать (лег­че, чем ис­ход­ный спи­сок эле­мен­тов), пре­вра­тив в пи­ра­ми­ду. Са­мый боль­шой эле­мент пи­ра­ми­ды на­хо­дит­ся в её вер­ши­не. От­де­ля­ем вер­шин­ный эле­мент, и за­пи­сы­ва­ем его в ко­нец ре­зуль­ти­рую­ще­го мас­си­ва. На ме­сто вер­шин­но­го эле­мен­та за­пи­сы­ва­ем эле­мент из са­мо­го ниж­не­го уров­ня де­ре­ва. Вос­ста­нав­ли­ва­ем (пе­ре­сор­ти­ро­вы­ва­ем) пи­ра­ми­ду. Са­мый боль­шой эле­мент из остав­ших­ся сно­ва в вер­ши­не. Сно­ва от­де­ля­ем его и за­пи­сы­ва­ем его в ка­че­стве пред­по­след­не­го эле­мен­та ре­зуль­та­та, и так да­лее...

Весь фо­кус ал­го­рит­ма в том, что пи­ра­ми­да без до­пол­ни­тель­ных за­трат хра­нит­ся пря­мо в ис­ход­ном мас­си­ве. По ме­ре то­го, как раз­мер пи­ра­ми­ды умень­ша­ет­ся, она за­ни­ма­ет всё мень­шую часть мас­си­ва, а ре­зуль­тат сор­ти­ров­ки за­пи­сы­ва­ет­ся на­чи­ная с кон­ца мас­си­ва на осво­бо­див­шие­ся от пи­ра­ми­ды ме­ста.

      1. Stooge Sort

Aлгоритм сортировки списка элементов заключается в следующем:

    • Если значение элемента в конце списка меньше, чем значение элемента в начале, то поменять их местами.

    • Если есть 3 или более элементов в текущем подмножестве списка, то:

  • Рекурсивно вызвать Stooge sort для первых 2/3 списка

  • Рекурсивно вызвать Stooge sort для последних 2/3 списка

  • Рекурсивно вызвать Stooge sort для первых 2/3 списка снова

    • Иначе: return

    1. Результаты работы программы

  • В этой части работы происходит сортировка 500, 1000, 2000, 3000, 5000 элементов различными видами сортировки.

Рис. 4. Пример работы 3-ей части программы

Количество элементов

Сортировка выбором

Сортировки пузырьком

Гномья сортировка

Сортировка вставками

Сортировка слиянием

Блочная сортировка

Сортировка Шелла

Пирамидальная сортировка

Быстрая сортировка

StoogeSort

500

9468

17163

12125

6704

7314

71765

5244

35311

4487

156951

1000

23975

50841

33055

15318

2069

300

1311

110200

1287

4713912

3000

212307

456311

366055

138286

7086

917

4785

990357

4803

126779531

5000

594456

1288161

807317

394908

12280

1361

8437

2733652

7646

397328583

Таблица 2. Зависимость времени выполнения сортировки от количества элементов

Рис.5. Зависимость времени выполнения сортировки от количества элементов

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]