
- •Оглавление
- •Постановка задачи
- •Входные и выходные данные.
- •Способ решения.
- •Укрупненная структура программы
- •Сортировка прямым выбором
- •Блок схема Сортировки прямым выбором
- •Сортировка пузырьком
- •Блок схема: сортировки пузырьком
- •Быстрая сортировка
- •Блок схема: быстрая сортировка.
- •Тестирование программы.
- •Анализ полученных результатов
- •Литература
- •Листинг программы.
Блок схема: сортировки пузырьком
Быстрая сортировка
Рассмотрим следующий вид сортировки, которая называется быстрая сортировка.
Пример дан массив, случайным образом в нем выбираем элемент. Допустим это тройка.
После этого все, что меньше тройки мы двигаем влево, а больше вправо. Получим следующий массив.
И отдельно теперь отсортируем все что левее тройки и правее тройки
Получим отсортированный массив.
Реализация алгоритма на Паскале будет иметь следующий вид:
program fff;
const
n=10; {Количество элементов массива}
var
i,j,x:integer;
a:array [0..n] of integer;
procedure swap(var a,b:integer); {Процедура меняет числа местами}
var
c:integer;
begin
c:=a;
a:=b;
b:=c;
end;
procedure qsort(l,r:integer); {Процедура производит сортировку}
var
x,i,j:integer;
begin
i:=l;
j:=r; {l,r левые и правые элементы массива}
x:=a[l+random(r-l+1)]; {выбираем элемент в массиве случайным образом, для того чтоб}
while i<=j do begin {программа не зависела от входных данных и работала в общем случае за одинаковое количество операций}
while(a[i]<x) do inc(i); {Ищем в левой части индексы элементов больших по значению чем наш}
while (a[j]>x) do dec(j); {Ищем в правой части индексы элементов меньших по значению чем наш}
if (i<=j)then begin {если такие элементы мы нашли то}
swap(a[i],a[j]); {меняет числа местами}
inc(i); {двигаемся дальше и ищем новые элементы}
dec(j); {двигаемся дальше и ищем новые элементы}
end;
end;
if r>I then qsort(i,r); {после того как мы отсортировали массив}
if l<j then qsort(l,j); {рекурсивно сортируем его левую и правую части и т.д.}
end;
BEGIN
for i:=1 to n do
a[i]:=random(10); {Ввод массива случайным образом от о до 9}
qsort(1,n); {сортируем}
for i:=1 to n do {Вывод элементов на экран}
write(a[i]:4);
writeln; {Для удобство просмотра програмы}
end.
Блок схема: быстрая сортировка.
Тестирование программы.
Тестированием программы заключается в проверки всех «ветвей», по которым пойдет алгоритм в зависимости от входных данных.
Размер массива 100 массив уже упорядоченный
Pquick=65, pselect=4950, pbuble=0, srselect=5049, srquick=616, srbuble=99;Tq=1,ts=66,tb=1;
Размер массива 1000 массив задан случайным образом.
Pquick=3102, pselect=5909, pbuble=238560, srselect=500499, srquick=5777, srbuble=928017;Tq=44,ts=82,tb=3290;
.
Анализ полученных результатов
Размер массива 100 элементов | ||||||||
Упорядоченный массив |
|
Упорядоченный в обратном порядке | ||||||
Перестановки |
4650 |
0 |
65 |
|
Перестановки |
2450 |
4950 |
118 |
Сравнения |
5049 |
99 |
592 |
|
Сравнения |
5049 |
9900 |
506 |
Время |
65 |
1 |
1 |
|
Время |
33 |
72 |
1 |
Наполовину упорядоченный |
|
Заданный злучайным оброзом | ||||||
Перестановки |
2450 |
2450 |
207 |
|
Перестановки |
317 |
2494 |
196 |
Сравнения |
5049 |
9801 |
386 |
|
Сравнения |
5049 |
9801 |
386 |
Время |
33 |
33 |
5 |
|
Время |
33 |
33 |
5 |
Размер массива 500 элементов | ||||||||
Упорядоченный массив |
|
Упорядоченный в обратном порядке | ||||||
Перестановки |
124750 |
0 |
330 |
|
Перестановки |
62250 |
124750 |
568 |
Сравнения |
125249 |
499 |
4436 |
|
Сравнения |
125243 |
249500 |
423 |
Время |
1 |
1 |
6 |
|
Время |
456 |
917 |
6 |
Наполовину упорядоченный |
|
Заданный злучайным оброзом | ||||||
Перестановки |
62250 |
62250 |
1265 |
|
Перестановки |
1928 |
61806 |
1358 |
Сравнения |
45149 |
249001 |
3238 |
|
Сравнения |
126249 |
230538 |
3189 |
Время |
456 |
456 |
11 |
|
Время |
12 |
456 |
6 |
Размер массива 1000 элементов | ||||||||
Упорядоченный массив |
|
Упорядоченный в обратном порядке | ||||||
Перестановки |
499500 |
0 |
660 |
|
Перестановки |
250000 |
2000 |
3000 |
Сравнения |
500499 |
999 |
1154 |
|
Сравнения |
500499 |
999000 |
9605 |
Время |
3669 |
1 |
5 |
|
Время |
1854 |
3675 |
6 |
Наполовину упорядоченный |
|
Заданный злучайным оброзом | ||||||
Перестановки |
249500 |
249500 |
2771 |
|
Перестановки |
3868 |
244317 |
3097 |
Сравнения |
500499 |
998001 |
6963 |
|
Сравнения |
500409 |
951048 |
5353 |
Время |
1835 |
1834 |
22 |
|
Время |
22 |
1801 |
22 |
По полученным данным можно сказать, что наиболее целесообразно использовать быструю сортировку массива, она обеспечивает выполнения сортировки за минимальное время особенно это сказывается при больших массивах.
Методика работы с программой.
При запуске программы появится информация об том, что это за программа и для каких целей она необходима. После этого надо выбрать нажать клавишу Enter и появится информация о выборе размера массива. Если хотите выбрать массив состоящий из 100 элементов, то необходимо нажать клавишу Enter. После этого надо будет выбрать способ первоначальной упорядоченности массива: если хотите выбрать отсортированный в прямом порядке нажмите 1 Enter. Если хотите выбрать отсортированный в обратном порядке нажмите клавишу 2 и Enter. Отсортированный наполовину 3 и клавишу Enter. И наконец массив заданный случайным образом надо выбрать 4.
После этого компьютер попросит нажать Ввод. Если сортировка будет проходить длительное время то вы увидите сообщения о том, что вам надо подождать.
Дальше появится результаты работы программы, которые отображены будут в виде трех гистограмм. Первая гистограмма это количество перестановок для трех различных сортировок массива. Вторая гистограмма это количество сравнений для трех различных сортировок массива. Третья это время каждой из сортировок.