Файл: Алгоритмы сортировки данных. (Определение понятия «сортировка массива»).pdf
Добавлен: 25.05.2023
Просмотров: 331
Скачиваний: 3
End;
r:= m-1;
Until k>r
Сравнение времени сортировок
Изображенный ниже график иллюстрирует разницу в эффективности изученных алгоритмов.
2.5 Сортировка выбором
Сортировка выбором (Selection sort) — может быть как устойчивый, так и неустойчивый. На массиве из n элементов имеет время выполнения в худшем, среднем и лучшем случае Θ(n2)(n2), предполагая что сравнения делаются за постоянное время.
Алгоритм метода сортировки Selection sort:
1) Ищем порядковый номер минимального значения в не отсортированной части массива.
2) Меняем его с крайним не отсортированным значением, если крайнее но отсортированное значение является минимальным ничего не делаем.
3) Повторяем пункты 1 и 2 пока весь массив не будет отсортирован[15].
Пример программы представлен в приложении А.
2.6 Сортировка Шелла
Сортировка Шелла примерно так же получается из сортировки вставками, как пузырьковая сортировка трансформируется в сортировку расчёской.
Сортируем вставкой подгруппы элементов, но только в подгруппе они идут не в ряд, а равномерно выбираются с некоторой дельтой по индексу. После первоначальных грубых проходов, дельта методично уменьшается, пока расстояние между элементами этих несвязных подмножеств не достигнет единицы. Благодаря первоначальным проходам с большим шагом, большинство малых по значению элементов перебрасываются в левую часть массива, большинство крупных элементов массива попадают в правую.
Как известно, вставочный метод очень эффективно обрабатывает почти отсортированные массивы. Сортировка Шелла при первоначальных проходах достаточно быстро и доводит массив к состоянию неполной упорядоченности. На заключительном этапе шаг равен единице, т.е. «Шелл» естественным образом трансформируется в сортировку простыми вставками[16].
Сложность по времени
Известно, что при удачном раскладе этот способ сортирует за O(n). Но, в целом, сортировка работает существенно медленнее чем, к примеру быстрая сортировка или сортировка слиянием. Средняя временная сложность зависит от того, какую последовательность брать для циклических итераций.
Первоначально автор сортировки, Дональд Шелл, предложил ряд
[n/4], [n/2], [n/8], …, 1
который давал скорость O(n2).
В течении последующих 50 лет, многие исследователи (среди которых — легендарный Роберт Седжвик) подбирали различные зависимости, постепенно улучшая результат. На данный момент таковым является ряд, предложенный в 2001 году Марсином Сиурой:
701, 301, 132, 57, 23, 10, 4, 1.
Это — результат многочисленных тестов, до сих пор неизвестно, можно или нельзя его улучшить[17].
Пример реализации сортировки Шелла паскаль:
incr:= n div 2;
while incr>0 do
begin
for i:=incr+1 to n do
begin
j:= i-incr;
while j>0 do
if A[j]>A[j+incr] then
begin
c:= A[j];
A[j]:=A[j+incr];
A[j+incr]:=A[j];
j:=j-incr
end
else j:=0 { останов проверки}
end;
incr:= incr div 2
end;
Сортировка хорошо подходит для массивов среднего размера — например, до нескольких тысяч элементов (в зависимости от конкретной реализации)[18].
Глава 3. Логарифмические и линейные алгоритмы
3.1 Пирамидальная сортировка
Далее рассмотрим более сложные методы сортировки, но они являются более эффективными.
Сортировку кучей называют также пирамидальной сортировкой.
Основная идея пирамидальной сортировки — ищем максимальный элемент в неотсортированной части массива и ставим его в конец этого подмассива. В поисках максимума подмассив перестраивается в так называемое сортирующее дерево (она же двоичная куча, она же пирамида), в результате чего максимум сам «всплывает» в начало массива. После этого перемещаем максимум в конец подмассива. Затем над оставшейся частью массива снова осуществляется процедура перестройки в сортирующее дерево с последующим перемещением максимума в конец подмассива.
Сортирующее (неубывающее) дерево — дерево у которого любой родитель не меньше чем каждый из его потомков. Если сортирующее дерево невозрастающее, то, соответственно, любой родитель не больше чем каждый из его потомков.
Является «умной» модификацией-синтезом сортировки выбором и пузырьковой сортировки[19].
Фрагмент программы, а именно пирамидальной сортировки показан ниже:
var L, R: integer;
x: integer;
procedure sift (L, R: integer);
var i, j: integer; x: integer;
begin i:=L; j:=2*L; x:=a[L]j
if (j<R) and (a[j] < a[j+l]) then j:=j+l;
while (j <= R) and (x < a[j]) do begin
a[i]:=a[j]j i:=j; j:=2*j;
if (j < R) and (a[j] < a[j+l]) then j:=j+l;
end;
a[i]:=x
end;
begin
L:=(n Div 2)+l; R:=n;
while L > 1 do begin L:=L-1; sift(L, R) end;
while R > - do begin
x:= a[l]; a[l]:= a[R]; a[R]:=x; R:=R-l; sift(L,
end;
Несмотря на некоторую внешнюю сложность, пирамидальная сортировка является одной из самых эффективных. Алгоритм сортировки эффективен для больших n. В худшем случае требуется n·log2n шагов, сдвигающих элементы. Среднее число перемещений примерно равно (n/2)·log2n, и отклонения от этого значения относительно невелики.
3.2 Быстрая сортировка
«Быстрая сортировка» была создана более 40 лет назад, является наиболее широко применяемым и одним их самых эффективных алгоритмов.
Метод быстрой сортировки основан на подходе "разделяй-и-властвуй". Общий метод сортировки следующий:
- из массива выбирается некоторый опорный элемент a[i],
- запускается процедура разделения массива, которая перемещает все ключи, меньшие, либо равные a[i], влево от него, а все ключи, большие, либо равные a[i] - вправо,
- теперь массив состоит из двух подмножеств, причем левое меньше, либо равно правого, то есть:
- для обоих подмассивов: если в подмассиве более двух элементов, рекурсивно запускаем для него ту же процедуру.
В конце получится полностью отсортированная последовательность[20].
То есть, берется некоторый элемент массива (желательно рандомом, чтобы алгоритм выполнялся приблизительно одинаковые промежутки времени для любых наборов данных). Элементы, которые находятся слева и больше по значению чем первоначальный, меняются местами с элементами, которые находятся справа и меньше первоначального. Аналогичная операция выполняется для наборов данных слева и справа от начального. И так далее по рекурсии до тех пока массив не будет отсортирован.
Даёт в среднем O(n log n) сравнений при сортировке n элементов. В худшем случае, однако, получается O(n2) сравнений. Обычно на практике быстрая сортировка значительно быстрее, чем другие алгоритмы с оценкой O(n log n), по причине того, что внутренний цикл алгоритма может быть эффективно реализован почти на любой архитектуре, и на большинстве реальных данных можно найти решения, которые минимизируют вероятность того, что понадобится квадратичное время[21].
Процедура сортировки методом быстрой сортировки представлен ниже:
procedure quicksort(var mas: array[1..n] of integer; first, last: integer);
var f, l, mid, count: integer;
begin
f:=first;
l:=last;
mid:=mas[(f+l) div 2]; {вычисление опорного элемента}
repeat
while mas[f]<mid do inc(f);
while mas[l]>mid do dec(l);
if f<=l then {перестановка элементов}
begin
count:=mas[f];
mas[f]:=mas[l];
mas[l]:=count;
inc(f);
dec(l);
end;
until f>l;
if first<l then quicksort(A, first, l);
if f<last then quicksort(A, f, last);
end;
Стоит отметить, что быстрая сортировка может оказаться малоэффективной на массивах, состоящих из небольшого числа элементов, поэтому при работе с ними разумнее отказаться от данного метода. В целом алгоритм неустойчив, а также использование рекурсии в неверно составленном коде может привести к переполнению стека. Но, несмотря на эти и некоторые другие минусы, быстрая сортировка все же является одним из самых эффективных и часто используемых методов.
3.3 Поразрядная сортировка
Ниже представленный метод сортировки существенно отличается от описанных ранее.
Поразрядная сортировка не использует сравнений сортируемых элементов. А так же ключ, по которому происходит сортировка по данному методы, необходимо разделить на части, разряды ключа. Например, слово можно разделить по буквам, число - по цифрам.
Применение поразрядной сортировки имеет одно маленькое «но»: да начало выполнения сортировки необходимо знать
length - максимальное количество разрядов в сортируемых величинах (например, при сортировке слов необходимо знать максимальное количество букв в слове),
range - количество возможных значений одного разряда (при сортировке слов - количество букв в алфавите).
Количество проходов равно числу length.
Пошаговое описание алгоритма
Пусть даны следующие числа: 39, 48, 54, 59, 34, 41, 32 (length = 2, range = 10)
1. Создаем пустые списки, количество которых равно числу range.
2. Распределяем исходные числа по этим спискам в зависимости от величины младшего разряда (по возрастанию).
Для нашего примера получим:
41
32
54, 34
48
59, 39
(Вообще надо создать 10 списков, но некоторые из них оказались пустыми)
3. Собираем числа в той последовательности, в которой они находятся после распределения по спискам.
Получим: 41, 32, 54, 34, 48, 59, 39
4. Повторяем пункты 2 и 3 для всех более старших разрядов поочередно.
Для двузначных чисел мы должны сделать еще один проход. Распределение по спискам будет выглядеть так:
32, 34, 39
41, 48
54, 59
Объединив числа в последовательность, получим отсортированный массив.
Заключение
Сортировка присутствует практически во всех приложениях операционных систем при обработке больших объемов данных. С помощью сортировки решаются задачи «группировки», когда нужно собрать элементы по некоторому признаку. В курсовом проекте выполнен обзор квадратичных и субквадратичных алгоритмов сортировки данных, а так же выполнен обзор логарифмических и линейных алгоритмов сортировки. Все рассмотренные методы сортировки ориентированы на компьютерную реализацию и актуальны для решения научно-технических задач в различных областях.
Кроме изучения литературы по данному вопросу были разработаны алгоритмы сортировки различными методами.
В результате изучения данной темы можно ответить на вопрос зачем необходимо программисту знать не один метод сортировки данных, а больше. Ответ прост – работать с упорядоченными данными намного проще, чем с неотсортированными. С другой стороны - одну и ту же задачу можно решить с помощью разных алгоритмов, и каждый раз изменение алгоритма приводит к новым, более или менее эффективным решениям задачи. Основными требованиями к эффективности алгоритмов сортировки является, прежде всего, эффективность по времени и экономное использование памяти. Согласно этим требованиям, простые алгоритмы сортировки (такие, как сортировка выбором и сортировки включением) не являются очень эффективными.
В связи с разнообразием задач на сортировку данных таблиц, существует много разных метод сортировки, которые целесообразно использовать в различных ситуациях, в целях экономии средств компьютера и времени пользователя.
Библиография
- Динман М. И. С++. Освой на примерах. - - СПб.: БХВ-Петербург, 2006.- 384 с: ил
- Катаев, С. М. Бейсик для школьников. Подготовка к ЕГЭ / С. М. Катаев. Л. В. Шеретнева. — СПб.: БХВ-Пстсрбург, 2012. — 272 с.
- Кетков Ю. Л., Кетков А. Ю. Практика программирования: Бейсик, Си, Паскаль. Самоучитель. — СПб.: БХВ-Петербург, 2001. - 480 с: ил
- Культин, Н. Small Basic для начинающих /II. Культин, Л. Цой. — СПб.: КХВ-Петербург, 2011. — 256 с.
- Лафоре P. Структуры данных и алгоритмы в Java. Классика Computers Science. 2-е изд. — СПб.: Питер, 2011. — 704 с.
- Макарова Н. В., Волков В. Б. Информатика: Учебник для вузов. — СПб.: Питер, 2015. — 576 с.
- Могилев, А. В. Методы программирования. Компьютерные вычисления/ А. В. Могилев, Л. В. Листрова. - - СПб,: БХВ-Петербург, 2008. - 320 с. - ISBN 978-5-9775-0151-4
- Простые методы сортировки массивов [онлайн] - URL: http://hosting.vspu.ac.ru/~chul/program/sortmass.pdf (дата обращения 24.09.2016)
- Понятие сортировки. Прямые методы сортировки [Онлайн] - URL: http://www.aisd.kubsau.ru/lections/lect_kurs_bi/lect9_bi.html (дата обращения 02.10.2016)
- Основные методы внутренней сортировки. Классификация методов сортировки [онлайн] - URL:http://studopedia.su/14_96708_osnovnie-metodi-vnutrenney-sortirovki.html (дата обращения 28.09.2016)).
- Сортировка вставками [онлайн] - URL: http://learnc.info/algorithms/insertionsort.html (дата обращения 01.10.2016)
- Сортировка вставками [онлайн] - URL: http://ucxodnuku.ru/algoritm/sortirovka-vstavkami.html (дата обращения 29.09.2016)
- Сортировка вставками [онлайн] - URL: http://cppstudio.com/post/462/ (дата обращения 29.09.2016)
- Сортировка Шелла :: Shell sort [онлайн] - URL: http://sorting.valemak.com/shell/ (дата обращения 29.09.2016)
- Сортировка кучей :: Heap sort [онлайн] - URL: http://sorting.valemak.com/heap/ (дата обращение 28.09.2016)
- Быстрая сортировка [онлайн] - URL: http://truthiness.ru/88951d72e2ba6711.html (дата обращения 27.09.2016)
- Лекция №4.1: Сортировки массивов [Онлайн] - URL:https://www.google.com/search?tbm=bks&q=+%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0+%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0 (дата обращения 02.10.2016)