Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
66
Добавлен:
06.06.2015
Размер:
55.3 Кб
Скачать

5

  1. Лабораторная работа № 3. Методы сортировки

    1. Задания

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 по убыванию.

    1. Теория

      1. Сортировка методом пузырька

В качестве примера возьмем массив 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

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

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

Будем строить готовую последовательность, начиная с левого конца массива. Алгоритм состоит из N последовательных шагов, начиная от нулевого и заканчивая (N-1)-м.

На i-м шаге выбираем наименьший из элементов a(i) ... a(n) и меняем его местами с a(i). Последовательность шагов при N=5 изображена на рисунке ниже.

Рис. 3. Последовательность шагов сортировки выбором

Вне зависимости от номера текущего шага i, последовательность a(1)...a(i) (выделена курсивом) является упорядоченной. Таким образом, на (N-1)-м шаге вся последовательность, кроме a(N) оказывается отсортированной, а a(N) стоит на последнем месте по праву: все меньшие элементы уже ушли влево.

Этот алгоритм, как и предыдущий, не требуют дополнительного использования памяти.

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

Сортировка простыми вставками в чем-то похожа на вышеизложенные методы. Аналогичным образом делаются проходы по части массива, и аналогичным же образом в его начале «вырастает» отсортированная последовательность. Однако в сортировке пузырьком или выбором можно было четко заявить, что на 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. достигнуто начало последовательности.

      1. Сортировка в 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

      1. Сортировка массива по убыванию

Любой массив, отсортированный по возрастанию легко преобразовать в отсортированный по убыванию. Пусть X — вектор из N элементов, отсортированный по возрастанию. Следующая программа преобразовывает его в вектор Z, отсортированный по убыванию.

Y = sort(X)

i = N:-1:1;

Z = Y(i)

      1. Время работы алгоритма

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

Для оценки производительности алгоритмов можно использовать разные подходы. Самый простой — запустить каждый алгоритм на нескольких задачах и сравнить время исполнения. Другой способ — оценить время исполнения через символ O(N) (читается так: «О большое от N»). N здесь — количество элементов обрабатываемого массива.

Когда используют обозначение O(), имеют в виду не точное время исполнения, а только его предел сверху, причем с точностью до постоянного множителя. Когда говорят, например, что алгоритму требуется время порядка O(N2), имеют в виду, что время исполнения задачи растет не быстрее, чем квадрат количества элементов.

Рассмотрим сортировку массива методом пузырька. Для нахождения наименьшего элемента из N рассматриваемых алгоритм совершает N-1 сравнений. С учетом того, что количество рассматриваемых на очередном шаге элементов уменьшается на единицу, общее количество операций составляет:

(N-1) + (N-2) + (N-3) + ... + 1 = 1/2 * ( N2+N ) = O(N2).

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

    1. Содержание отчета

Оформить титульный лист в соответствии с требованиями и своими персональными данными.

В отчет необходимо включить:

цель лабораторной работы;

условия и ход выполнения самостоятельных заданий в порядке их следования;

графики и screenshot’ы, отображающие и иллюстрирующие полученные результаты, появляющиеся в рабочем окне MATLAB;

выводы.