М.А.И.
(Национальный Исследовательский Университет)
Лабораторная работа № 10
Практикум № (Сортировка)
МЕТОДЫ СОРТИРОВКИ
Вариант № 24
Оформил: Абрамов Иван Андреевич
Проверил: Кривилёв А. В.
Москва 2012
Цель работы: ознакомление с методами сортировки массивов, сравнение эффективности различных методов и зависимости времени сортировки от объема массива.
Упражнение 1.
Сортировка выборкой на месте
Алгоритм сортировки массива выборкой на месте состоит в следующем. Производится последовательный перебор элементов массива начиная с пер-вого. Для взятого текущего элемента в оставшейся части массива (от те-кущего элемента и до крайней правой границы) находится минимальное значение. Далее текущий элемент и элемент, имеющий минимальное значе-ние, переставляются местами. Очевидно, данный метод сортировки предпо-лагает выполнение двух операторов цикла: 1) перебор элементов от пер-вого и до последнего; 2) перебор элементов от текущего и до правой границы.
|
|
Процесс сортировки можно проиллюстрировать графически следующим об-разом (стрелками показаны элементы, которые меняются местами): x1 | x2 | … | … | … | xmin | … | … |
xmin | x2 | … | … | xmin’ | … | … | … |
xmin | xmin’ | x3 | … | … | … | xmin”… | … |
… | |||||||
xmin | xmin’ | xmin” | x4 | … | … | … | … |
T = []; % формируется пустой массив времени сортировки
N = [];
for n = [ 1000: 1000: 5000 ]; % меняется размерность массива данных
N = [ N n ];
time = round(clock); % определяется текущее время для инициализации датчика случайных чисел
rand('seed', time(5)*time(6)); % осуществляется инициализация датчика случайных чисел
x = rand(1, n); % генерируется массив случайных чисел из диапазона [ 0 1 ]
x = round(100*x); % случайный массив целых двузначных чисел
t_start = clock; % фиксируется время старта сортировки
for I = 1: (n-1)
min_x = x(I); index = I; % предполагается, что минимальный элемент имеет номер I
for J = (I+1): n % перебираются все элементы от I+1 до n
if x(J) < min_x % если находится элемент меньше, чем
текущий минимум, то он становится
min_x = x(J); % текущим минимальным
index = J; % фиксируется его номер
end
end
buff = x(I); % текущий элемент и минимальный
x(I) = x(index); % меняются местами
x(index) = buff;
end
t_stop = clock; % фиксируется время остановки сортировки
t = t_stop(6) - t_start(6); % вычисляется время сортировки (сек)
T = [ T t ]; % формируется массив времен сортировки
end;
plot(N, T), grid on % строится график зависимости времени
Сортировка методом «пузырька»
Алгоритмы сортировки обменом основаны на перестановке двух соседних элементов. Соседние элементы меняются местами, если элемент с меньшим номером имеет большее значение (напомним, что речь идет о сортировке в неубывающем порядке). Если максимальный элемент находится на левой границе, то вследствие перестановок он за один прогон будет «выдавлен» на правую границу. Очевидно, что после первого этапа упоря-дочения массива, значение максимального элемента переместится на пра-вую границу. Следовательно, второй этап упорядочения должен произво-диться уже не до правой границы, а до элемента, смещенного влево отно-сительно правой границы на один. И так далее.
|
|
T = [];
for n = [ 1000: 1000: 5000 ];
time = round(clock);
rand('seed', time(5)*time(6));
x = rand(1, n);
x = round(100*x);
t_start = clock;
J = n - 1; % устанавливается начальное значение
% правой "границы" сортировки
while J ~= 0 % пока эта граница не совпала с началом массива
for I = 1: J % перебираются все элементы с 1-го
% до "границы" сортировки
if x(I) > x(I+1) % если условие упорядочения массива
% не выполнено, то два соседних
buff = x(I); % меняются местами
x(I) = x(I+1);
x(I+1) = buff;
end;
end;
J = J - 1; % "граница" сортировки сдвигается влево
end;
t_stop = clock;
t = t_stop(6) - t_start(6);
T = [ T t ];
end;
plot(T), grid on