Автор работы: Пользователь скрыл имя, 10 Декабря 2011 в 16:34, курсовая работа
Еще в раннем детстве в нас просыпается стремление к разрушению и хаосу - один их базовых инстинктов человека. Но по мере взросления в нас крепнет противоположное начало - тяга к упорядочиванию и систематизации. Появление компьютеров дало возможность работать с куда большими объемами информации. Проблема упорядочивания стала более остро, на нее были кинуты силы лучших умов человечества.
ВВЕДЕНИЕ
Еще в раннем детстве в нас просыпается стремление к разрушению и хаосу - один их базовых инстинктов человека. Но по мере взросления в нас крепнет противоположное начало - тяга к упорядочиванию и систематизации. Появление компьютеров дало возможность работать с куда большими объемами информации. Проблема упорядочивания стала более остро, на нее были кинуты силы лучших умов человечества.
Часто нужно упорядочить предметы по какому-то признаку: записать данные числа в порядке возрастания, слова — по алфавиту, людей выстроить по росту. Если можно сравнить любые два предмета из данного набора, то этот набор всегда можно упорядочить. Процесс упорядочивания информации и называют «сортировкой»
Пусть
нам требуется упорядочить
Для информатиков намного занимательнее вопрос, как был получен ответ. Человек, скорее всего, будет работать так. Перед глазами у него записан беспорядочный набор чисел. Если числа большие и их много, ему обязательно потребуется дополнительное запоминающее устройство, например карандаш с бумагой.
Сортировка
относится к алгоритмам обработки
таблиц (массивов) любого типа. Смысл
этой задачи заключается в перестановке
элементов таблицы в
«Алгоритм сортировки» — это алгоритм для упорядочения элементов в списке. В случае, когда элемент списка имеет несколько полей, поле, служащее критерием порядка, называется ключом сортировки. На практике, в качестве ключа часто выступает число, а в остальных полях хранятся какие-либо данные, никак не влияющие на работу алгоритма. Изучение алгоритмов совсем не лёгкая задача, здесь требуется внимательное рассмотрение каждой строчки.
Итак, постановка задачи такова: есть набор неупорядоченных данных (массив); задача - выдать те же данные, упорядоченные по некоторому полю (ключу) по возрастанию (убыванию). Обычно данные представляются в виде ключа и некоторой связанной с ним информации. Например, год рождения и фамилия.
Существует огромное количество методов, которыми нам предлагают сортировать данные. Зачем же так много? И правда - может, достаточно одного эффективного способа, и не надо морочить себе голову таким обилием? Ответ на этот вопрос состоит в том, что очень трудно иногда бывает сопоставить эффективность двух разных методов. Проще говоря: одни более удобны в одних случаях, другие - в других.
Все из существующих ныне способов сортировки отличаются друг от друга по скорости выполнения, понятности и длине кода, по красоте решения. Зачастую в код уже разработанного алгоритма вносятся какие либо изменения и так возникает множество решений. Проблемам сортировок Дональд Кнут посвятил целый том своего «Искусства программирования».
Известные алгоритмы сортировки данных, расположенных в оперативной памяти, чрезвычайно разнообразны. Их анализ очень полезен с точки зрения обучения, так как в них используются практически все универсальные приемы конструирования алгоритмов любой сложности. По словам Н. Вирта, "создается впечатление, что можно построить целый курс программирования, выбирая примеры только из задач сортировки". Интересен этот класс алгоритмов еще и тем, что на нем наглядно демонстрируются богатейшие возможности программирования: насколько разными путями можно прийти к одной цели - получению упорядоченной таблицы! На множестве алгоритмов сортировки становится понятной необходимость оценки качества алгоритма, критериями которого являются экономия памяти и увеличение быстродействия.
Алгоритмы сортировки оцениваются по скорости выполнения и эффективности использования памяти:
Время — основной параметр, характеризующий быстродействие алгоритма. Называется также вычислительной сложностью. Для упорядочения важны худшее, среднее и лучшее поведение алгоритма в терминах размера списка (n). Для типичного алгоритма хорошее поведение — это O(n log n) и плохое поведение — это O(n²). Идеальное поведение для упорядочения — O(n). Алгоритмы сортировки, использующие только абстрактную операцию сравнения ключей всегда нуждаются по меньшей мере в O(n log n) сравнениях в среднем;
Память — ряд алгоритмов требует выделения дополнительной памяти под временное хранение данных. При оценке используемой памяти не будет учитываться место, которое занимает исходный массив и независящие от входной последовательности затраты, например, на хранение кода программы.
Устойчивость (stability) — устойчивая сортировка не меняет взаимного расположения равных элементов.
Естественность поведения — эффективность метода при обработке уже упорядоченных, или частично упорядоченных данных. Алгоритм ведёт себя естественно, если учитывает эту характеристику входной последовательности и работает лучше.
Использование операции сравнения. Алгоритмы, использующие для сортировки сравнение элементов между собой, называются основанными на сравнениях. Минимальная трудоемкость худшего случая для этих алгоритмов составляет O(n*log(n)), но они отличаются гибкостью применения. Для специальных случаев (типов данных) существуют более эффективные алгоритмы.
Ещё одним важным свойством алгоритма является его сфера применения. Здесь основных типов упорядочения два:
Внутренняя сортировка оперирует с массивами, целиком помещающимися в оперативной памяти с произвольным доступом к любой ячейке. Данные обычно упорядочиваются на том же месте, без дополнительных затрат.
В современных архитектурах персональных компьютеров широко применяется подкачка и кэширование памяти. Алгоритм сортировки должен хорошо сочетаться с применяемыми алгоритмами кэширования и подкачки.
Внешняя сортировка оперирует с запоминающими устройствами большого объёма, но с доступом не произвольным, а последовательным (упорядочение файлов), т.е в данный момент мы 'видим' только один элемент, а затраты на перемотку по сравнению с памятью неоправданно велики. Это накладывает некоторые дополнительные ограничения на алгоритм и приводит к специальным методам упорядочения, обычно использующим дополнительное дисковое пространство. Кроме того, доступ к данным на носителе производится намного медленнее, чем операции с оперативной памятью:
- доступ к носителю осуществляется последовательным образом: в каждый момент времени можно считать или записать только элемент, следующий за текущим;
- объём данных не позволяет им разместиться в ОЗУ.
3. Список алгоритмов сортировки
В этом списке n — это количество записей, которые необходимо упорядочить, а k — это количество уникальных ключей.
4. Описание некоторых алгоритмов
Рассмотрим несколько алгоритмов, которые во-первых, наиболее часто используются, а во-вторых, потому что большинство остальных алгоритмов является различными их модификациями, некоторые из которых также будут рассмотрены.
4.1 Сортировка пузырьком
Чаще всего используется для сортировки частично упорядоченных списков, так как именно для них скорость выполнения максимальна и может равняться O(N), где N количество элементов массива, а O время одного прохода через цикл.
Этот
алгоритм в исходном списке ищет пары
цифр, которые следуют не по порядку
и затем меняет их местами. Процесс
повторяется до тех пор, пока весь список
не будет отсортированным. На рисунке
изображен пример сортировки данным методом.
На рисунке можно проследить за перемещением
элемента, который изначально был ниже,
чем после сортировки. Во время прохода
цикла, элемент изменяет свою позицию
на одну позицию ближе к своему конечному
месту. На рисунке элемент двигается к
вершине, как пузырёк воздуха к поверхности
воды. Этот эффект и дал название алгоритму
пузырьковой сортировке.
Как видно, алгоритм достаточно прост, но, как иногда замечают, он является непревзойденным в своей неэффективности. Немного более эффективным, но таким наглядным является второй метод.
4.2 Сортировка выбором
На этот раз при просмотре мaccива мы будем искать наименьший элемент, сравнивая его с первым. Если такой элемент найден, поменяем его местами с первым. Затем повторим эту операцию, но начнем не с первого элемента, а со второго. И будем продолжать подобным образом, пока не рассортируем весь массив.