
Лабораторные работы / Лабораторная работа №3 / Лабораторная работа №3
.doc-
Лабораторная работа № 3. Методы сортировки
-
Задания
-
1. Задайте массив A, состоящий из N целых чисел, заданных случайным образом.
A = round(N*rand(1,N))
2. Отсортируйте массив А по возрастанию с помощью метода пузырька для N = 100.
3. Засеките время выполнения сортировки для массива А с числом элементов N = 10,100,1000,10000 и постройте график зависимости времени выполнения алгоритма от N.
tic … toc или t = cputime … cputime-t
4. Выполните задания 2, 3 для другого метода сортировки (по выбору). Сравните полученные результаты с результатами выполнения заданий 2, 3. Чем, по вашему мнению, объясняется разница в результатах.
5. Отсортируйте исходный массив A по убыванию.
-
Теория
-
Сортировка методом пузырька
-
В качестве примера возьмем массив a = [4 9 7 6 2 3]. Для наглядности расположим его сверху вниз, от первого элемента к последнему.
Каждый шаг сортировки состоит в проходе снизу вверх по массиву. По пути просматриваются пары соседних элементов. Если элементы некоторой пары находятся в неправильном порядке, то меняем их местами (рис. 1).
Рис. 1. Первый проход сортировки по методу пузырька
После нулевого прохода по массиву «вверху» оказывается самый «легкий» элемент — отсюда аналогия с пузырьком. Следующий проход делается до второго сверху элемента. Таким образом, второй по величине элемент поднимается на правильную позицию, и т. д.
Делаем проходы по все уменьшающейся нижней части массива до тех пор, пока в ней не останется только один элемент. На этом сортировка заканчивается, так как последовательность упорядочена по возрастанию.
Рис. 2. Проходы сортировки
Алгоритм сортировки:
a = [4 9 7 6 2 3];
N = length(a);
for i = 2:N % (i-1) - номер прохода
for j = N:-1:i % внутренний цикл прохода
if a(j-1) > a(j)
x=a(j-1); a(j-1)=a(j); a(j)=x;
end
end
end
-
Сортировка выбором
Идея метода состоит в том, чтобы создавать отсортированную последовательность путем присоединения к ней одного элемента за другим в правильном порядке.
Будем строить готовую последовательность, начиная с левого конца массива. Алгоритм состоит из N последовательных шагов, начиная от нулевого и заканчивая (N-1)-м.
На i-м шаге выбираем наименьший из элементов a(i) ... a(n) и меняем его местами с a(i). Последовательность шагов при N=5 изображена на рисунке ниже.
Рис. 3. Последовательность шагов сортировки выбором
Вне зависимости от номера текущего шага i, последовательность a(1)...a(i) (выделена курсивом) является упорядоченной. Таким образом, на (N-1)-м шаге вся последовательность, кроме a(N) оказывается отсортированной, а a(N) стоит на последнем месте по праву: все меньшие элементы уже ушли влево.
Этот алгоритм, как и предыдущий, не требуют дополнительного использования памяти.
-
Сортировка вставками
Сортировка простыми вставками в чем-то похожа на вышеизложенные методы. Аналогичным образом делаются проходы по части массива, и аналогичным же образом в его начале «вырастает» отсортированная последовательность. Однако в сортировке пузырьком или выбором можно было четко заявить, что на i-м шаге элементы a(1)...a(i) стоят на правильных местах и никуда более не переместятся. Здесь же подобное утверждение будет более слабым: последовательность a(1)...a(i) упорядочена, но по ходу алгоритма в нее будут вставляться все новые элементы (отсюда и происходит название метода).
Будем разбирать алгоритм, рассматривая его действия на i-м шаге. Как говорилось выше, последовательность к этому моменту разделена на две части: готовую a(1)...a(i) и неупорядоченную a(i+1)...a(N).
Рис. 4. Последовательность шагов сортировки вставками
На следующем, (i+1)-м каждом шаге алгоритма берем a(i+1) и вставляем на нужное место в готовую часть массива.
Поиск подходящего места для очередного элемента входной последовательности осуществляется путем последовательных сравнений с элементом, стоящим перед ним. В зависимости от результата сравнения элемент либо остается на текущем месте (вставка завершена), либо они меняются местами и процесс повторяется. Таким образом, в процессе вставки мы «просеиваем» элемент x к началу массива, останавливаясь в случаях, когда
1. найден элемент, меньший x или
2. достигнуто начало последовательности.
-
Сортировка в MATLAB
В MATLAB сортировка по возрастанию, реализована в функции sort:
Y = sort(X)
Если X — одномерный массив (вектор), то результатом выполнения функции sort будет вектор той же размерности Y, отсортированный по возрастанию.
X = [4 9 7 6 2 3];
Y = sort(X)
Y =
2 3 4 6 7 9
-
Сортировка массива по убыванию
Любой массив, отсортированный по возрастанию легко преобразовать в отсортированный по убыванию. Пусть X — вектор из N элементов, отсортированный по возрастанию. Следующая программа преобразовывает его в вектор Z, отсортированный по убыванию.
Y = sort(X)
i = N:-1:1;
Z = Y(i)
-
Время работы алгоритма
Алгоритм — это строго определённая последовательность действий, направленная на достижение определённых целей за конечное число шагов. Одной из основных характеристик работы любых алгоритмов и, в частности, алгоритмов сортировки является время работы алгоритма.
Для оценки производительности алгоритмов можно использовать разные подходы. Самый простой — запустить каждый алгоритм на нескольких задачах и сравнить время исполнения. Другой способ — оценить время исполнения через символ O(N) (читается так: «О большое от N»). N здесь — количество элементов обрабатываемого массива.
Когда используют обозначение O(), имеют в виду не точное время исполнения, а только его предел сверху, причем с точностью до постоянного множителя. Когда говорят, например, что алгоритму требуется время порядка O(N2), имеют в виду, что время исполнения задачи растет не быстрее, чем квадрат количества элементов.
Рассмотрим сортировку массива методом пузырька. Для нахождения наименьшего элемента из N рассматриваемых алгоритм совершает N-1 сравнений. С учетом того, что количество рассматриваемых на очередном шаге элементов уменьшается на единицу, общее количество операций составляет:
(N-1) + (N-2) + (N-3) + ... + 1 = 1/2 * ( N2+N ) = O(N2).
Таким образом, время сортировки методом пузырька (как и других рассмотренных в этой работе методов) растет квадратично относительно количества элементов.
-
Содержание отчета
Оформить титульный лист в соответствии с требованиями и своими персональными данными.
В отчет необходимо включить:
цель лабораторной работы;
условия и ход выполнения самостоятельных заданий в порядке их следования;
графики и screenshot’ы, отображающие и иллюстрирующие полученные результаты, появляющиеся в рабочем окне MATLAB;
выводы.