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

AiSD_metoda

.pdf
Скачиваний:
14
Добавлен:
07.06.2015
Размер:
693.92 Кб
Скачать

b:=a; sort_insert(b);

output_to_file('result.txt','После сортировки вставками:',b); b:=a; sort_choice(b);

output_to_file('result.txt','После сортировки выбором:',b); b:=a; sort_hoor(b);

output_to_file('result.txt','После быстрой сортировки Хоора:',b); b:=a; sort_wf(b);

output_to_file('result.txt','После сортировки методом пирамиды Уильямса-Флойда:',b);

writeln('Ok')

end.

Исходный текстовый файл:

Сидорова Елена ИС-10-1 1993 75.8 Петров Павел ИС-10-1 1993 88.2 Иванов Алексей ИС-10-1 1993 61.8 Зосимова Елена ИС-10-2 1993 55.0

Иванов Иван ИС-10-2 1991 95.4

Результаты:

 

 

 

 

 

 

 

Исходный массив

 

 

 

 

 

 

|

-----------------------------------------------

 

 

 

 

 

 

 

|

Фамилия

|

Имя

|

Группа

| Г.р. | С.р. |

|-----------------------------------------------

 

 

 

 

 

 

 

 

|

Сидорова |

Елена|

ИС-10-1|

1993|

75.8|

|

Петров |

Павел|

ИС-10-1|

1993|

88.2|

|

Иванов |

Алексей|

ИС-10-1|

1993|

61.8|

|

Зосимова |

Елена|

ИС-10-2|

1993|

55.0|

|

Иванов |

Иван|

ИС-10-2|

1993|

95.4|

|-----------------------------------------------

 

 

 

 

 

 

 

 

После сортировки обменами:

 

 

 

 

 

|-----------------------------------------------

 

 

 

 

 

 

 

 

|

Фамилия

|

Имя

|

Группа

| Г.р. | С.р. |

|-----------------------------------------------

 

 

 

 

 

 

 

 

|

Зосимова |

Елена|

ИС-10-2|

1993|

55.0|

|

Иванов |

Алексей|

ИС-10-1|

1993|

61.8|

|

Иванов |

Иван|

ИС-10-2|

1991|

95.4|

|

Петров |

Павел|

ИС-10-1|

1993|

88.2|

|

Сидорова |

Елена|

ИС-10-1|

1993|

75.8|

|-----------------------------------------------

 

 

 

 

 

 

 

 

31

После сортировки вставками:

 

 

 

 

 

|

-----------------------------------------------

 

 

 

 

 

 

 

|

Фамилия

|

Имя

|

Группа

| Г.р. | С.р. |

|

-----------------------------------------------

 

 

 

 

 

 

 

|

Зосимова |

Елена|

ИС-10-2| 1993|

55.0|

|

Иванов |

Алексей|

ИС-10-1| 1993|

61.8|

|

Иванов |

Иван|

ИС-10-2| 1991|

95.4|

|

Петров |

Павел|

ИС-10-1| 1993|

88.2|

|

Сидорова |

Елена|

ИС-10-1|

1993|

75.8|

|-----------------------------------------------

 

 

 

 

 

 

 

 

После сортировки выбором:

 

 

 

 

 

|-----------------------------------------------

 

 

 

 

 

 

 

 

|

Фамилия

|

Имя

|

Группа

| Г.р. | С.р. |

|-----------------------------------------------

 

 

 

 

 

 

 

 

|

Зосимова |

Елена|

ИС-10-2| 1993|

55.0|

|

Иванов |

Алексей|

ИС-10-1| 1993|

61.8|

|

Иванов |

Иван|

ИС-10-2| 1991|

95.4|

|

Петров |

Павел|

ИС-10-1| 1993|

88.2|

|

Сидорова |

Елена|

ИС-10-1|

1993|

75.8|

|-----------------------------------------------

 

 

 

 

 

 

 

 

После быстрой сортировки Хоора:

 

 

 

 

|-----------------------------------------------

 

 

 

 

 

 

 

 

|

Фамилия

|

Имя

|

Группа

| Г.р. | С.р. |

|-----------------------------------------------

 

 

 

 

 

 

 

 

|

Зосимова |

Елена|

ИС-10-2| 1993|

55.0|

|

Иванов |

Иван|

ИС-10-2| 1991|

95.4|

|

Иванов |

Алексей|

ИС-10-1| 1993|

61.8|

|

Петров |

Павел|

ИС-10-1| 1993|

88.2|

|

Сидорова |

Елена|

ИС-10-1|

1993|

75.8|

|-----------------------------------------------

 

 

 

 

 

 

 

 

После сортировки методом пирамиды Уильямса-Флойда:

 

|-----------------------------------------------

 

 

 

 

 

 

 

 

|

Фамилия

|

Имя

|

Группа

| Г.р. | С.р. |

|-----------------------------------------------

 

 

 

 

 

 

 

 

|

Зосимова |

Елена|

ИС-10-2| 1993|

55.0|

|

Иванов |

Алексей|

ИС-10-1| 1993|

61.8|

|

Иванов |

Иван|

ИС-10-2| 1991|

95.4|

|

Петров |

Павел|

ИС-10-1| 1993|

88.2|

|

Сидорова |

Елена|

ИС-10-1|

1993|

75.8|

|-----------------------------------------------

 

 

 

 

 

 

 

 

32

ЛАБОРАТОРНАЯ РАБОТА №5

Алгоритмы поиска данных Цель работы: получение навыков составления программ для реали-

зации некоторых алгоритмов поиска данных на языке программирования Паскаль.

Теоретические сведения – [11, c. 61 – 81].

Задание к работе. Сформировать массив записей (не менее 5), содержащий данные по студентам в следующем виде: «Фамилия Имя Отчество Группа Город ГР RS», где ГР – год рождения, RS – средний рейтинг (данные можно считывать из предварительно набранного текстового файла). Найти студента, полностью соответствующего заданным параметрам (варианты 1-14, табл. 9) или чьи текстовые параметры содержат заданную строку (варианты 15-24).

Таблица 9 – Варианты заданий

Вар.

Поле для поиска

Алгоритм поиска

1

Фамилия

 

2

Имя

 

3

Отчество

 

4

Группа

Линейный (прямой) поиск

5

Город

 

6

Год рождения

 

7

Средний рейтинг

 

8

Фамилия

 

9

Имя

 

10

Отчество

 

11

Группа

Двоичный поиск

12

Город

 

13

Год рождения

 

14

Средний рейтинг

 

15

Фамилия

 

16

Имя

 

17

Отчество

Алгоритм Кнута-Морриса-Пратта

18

Группа

 

19

Город

 

20

Фамилия

 

21

Имя

 

22

Отчество

Алгоритм Боуэра-Мура

23

Группа

 

24

Город

 

33

САМОСТОЯТЕЛЬНАЯ РАБОТА

Разработка системы для сравнения алгоритмов сортировки данных

Теоретические сведения – [11, 14].

Задание

В соответствии с вариантом реализовать один или два заданных алгоритма (табл.10) и выполнить их анализ по критерию «Время выполнения»: для первого и второго алгоритма; для наилучшего, наихудшего и среднего случая. Критериями «Требования к объему оперативной памяти» и «Сложность алгоритма» пренебрегаем. Для исследований используется массив, состоящий из 10 000 элементов – целых чисел.

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

Таблица 10 – Варианты заданий

Ф

Алгоритм

1,2

А

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

3,4

Б

Сортировка вставками (метод прямого включения)

5,6

В

Сортировка прямыми обменами (пузырьковый метод)

7

Г

Шейкерная сортировка (улучшенный пузырьковый метод)

8

Д

Улучшенная сортировка вставками (метод Шелла)

9,10

Е,Ж

Сортировка с помощью дерева (метод Уильямса-Флойда)

11,12

З,И

Быстрая сортировка (метод Хоора)

13

К

Улучшенная быстрая сортировка (метод медианы из трех

элементов)

 

 

14

Л

Быстрая сортировка с разделением на три части (метод

Бентли-Макилроя)

 

 

15

М

Сортировка двухпутевым слиянием

16

Н

Сортировка абстрактным обменным слиянием

17

О

Нисходящая сортировка слиянием

18

П

Сортировка слиянием без копирования

19

Р

Восходящая сортировка слиянием

20

С,Т

Бинарная быстрая сортировка

21

У,Ф

Поразрядная сортировка MSD

22

Х, Ц

Трехпутевая поразрядная быстрая сортировка

23

Ч,Ш

Поразрядная сортировка LSD

24

Щ,Э

Четно-нечетная сортировка слиянием (1-й метод Бэтчера)

25

Ю,Я

Нечетно-четная сортировка слиянием (2-й метод Бэтчера)

34

Пример выполнения задания

Выдан вариант № 5, первая буква фамилии студента – З. Сравниваются алгоритмы сортировки прямыми обменами (пузырь-

ковый метод) и быстрой сортировки (метод Хоора).

Описание выбранных алгоритмов сортировки

Суть метода сортировки обменами («метода пузырька») состоит в последовательном просмотре массива от конца к началу или от начала к концу и сравнении каждой пары элементов между собой. При этом «неправильное» расположение элементов устраняется путем их перестановки (обмена значениями). Процесс просмотра и сравнения элементов повторяется до получения результата. При сортировке по неубыванию «легкие» элементы с меньшим значением как бы «всплывают» к началу массива подобно тому, как это делают пузырьки воздуха в стакане с водой – отсюда и происходит популярное название алгоритма. «Пузырьковая» сортировка имеет очень плохие временные характеристики – ее трудоемкость выражается величиной вида O(n2), где n – размер массива.

Метод «быстрой» сортировки, предложенный К. Хоором, основан на разделении массива на два непустых непересекающихся подмножества элементов. При этом в одной части массива должны оказаться все элементы, которые не превосходят по значению некоторый предварительно выбранный элемент массива, а в другой части – все элементы, не меньшие его. Аналогично следует поступить с каждой из полученных групп (при этом элемент для разделения можно выбирать просто из «середины» группы). Очевидно, что на определенном этапе массив окажется полностью отсортированным. В подавляющем большинстве реальных случаев использование «быстрой» сортировки дает лучшие результаты по времени, чем все прочие методы.

Реализация методов в среде Turbo-Pascal

program analize_methods; uses dos;

const amax=10000;

type ar=array [1..amax] of integer; ar3=array [1..3] of ar;

var a:ar3;b:^ar3;

time:array [1..2,1..3] of real; hour,min,sec,sec100:word; r,r1,r2:real;

ns,i,k:integer;

f:text;

35

{Стандартная процедура для обмена значениями} procedure obmen(var a,b:integer);

var r:integer; begin

r:=a;a:=b;b:=r

end;

{Метод сортировки обменами (алгоритм "пузырька")} procedure sort_obmen(var m:ar);

var i,j:integer; begin

for i:=2 to amax do

for j:=amax downto i do

if m[j-1] > m[j] then obmen(m[j-1],m[j]) end;

{Метод "быстрой" сортировки (алгоритм Хоора)} procedure hoor(var m:ar);

procedure sort(l,r:integer); var i,j,x:integer;

begin

i:=l;j:=r;x:=m[(l+r) div 2]; while i <= j do

begin

while m[i] < x do i:=i+1; while m[j] > x do j:=j-1; if i <= j then

begin obmen(m[i],m[j]);i:=i+1;j:=j-1; end;

end;

if l < j then sort(l,j); if i < r then sort(i,r);

end; begin

sort(1,amax);

end;

{Главная программа} begin

randomize;

assign(f,'pasc.txt');rewrite(f);

writeln(f,'Сравнение двух методов сортировки в Турбо-Паскале'); writeln(f); new(b);

{Заполнение идеальными данными} for i:=1 to amax do a[1,i]:=i;

{Заполнение случайными данными} for i:=1 to amax do a[2,i]:=random(amax);

36

{Заполнение худшими данными} for i:=1 to amax do a[3,i]:=amax+1-i;

{Начинаем сортировку}

for ns:=1 to 2 do begin {два алгоритма} if ns=1 then begin

writeln('Метод сортировки обменами'); writeln(f,'Метод сортировки обменами'); end

else begin

writeln('Метод быстрой сортировки'); writeln(f,'Метод быстрой сортировки'); end;

writeln;writeln(f);

{Передаем во второй массив} for k:=1 to 3 do b^[k]:=a[k];

{Сортировка}

for i:=1 to 3 do begin case i of

1:begin writeln('Идеальное расположение'); writeln(f,'Идеальное расположение') end;

2:begin writeln('Случайное расположение'); writeln(f,'Случайное расположение') end;

3:begin writeln('Обратное расположение'); writeln(f,'Обратное расположение') end;

end;

writeln('До сортировки:');writeln(f,'До сортировки:');

for k:=1 to 10 do begin write(b^[i,k],' ');write(f,b^[i,k],' ') end; writeln;writeln(f);

gettime(hour,min,sec,sec100);

r1:=sec100/100+sec+min*60+hour*3600;

if ns=1 then sort_obmen(b^[i]) else hoor(b^[i]); gettime(hour,min,sec,sec100); r2:=sec100/100+sec+min*60+hour*3600; time[ns,i]:=r2-r1;

writeln('После сортировки:');writeln(f,'После сортировки:'); for k:=1 to 10 do begin write(b^[i,k],' ');write(f,b^[i,k],' ') end; writeln;writeln(f);

writeln('Время: ',time[ns,i]:0:2);writeln; writeln(f,'Время: ',time[ns,i]:0:2);writeln(f); end;{i}

writeln;writeln(f);

end;{ns}

writeln('Подведение итогов (время в секундах)'); writeln(f,'Подведение итогов (время в секундах)'); writeln('|----------------------------------------------|');

37

writeln('| Алгоритм | Идеальный | Случайный | Наихудший |');

writeln('|----------------------------------------------

|');

writeln(f,'|----------------------------------------------

|');

writeln(f,'| Алгоритм | Идеальный | Случайный | Наихудший |'); writeln(f,'|----------------------------------------------|');

for ns:=1 to 2 do begin

if ns=1 then begin write('| Обмен ');write(f,'| Обмен ') end else begin write('| Хоор ');write(f,'| Хоор ') end;

for i:=1 to 3 do begin write('|',time[ns,i]:11:2);write(f,'|',time[ns,i]:11:2) end; writeln('|');writeln(f,'|')

end;

 

writeln('|----------------------------------------------

|');

writeln(f,'|----------------------------------------------

|');

close(f);

 

dispose(b)

 

end.

 

Сравнение двух методов сортировки в Турбо-Паскале

Метод сортировки обменами

Идеальное расположение До сортировки:

1 2 3 4 5 6 7 8 9 10

После сортировки:

1 2 3 4 5 6 7 8 9 10

Время: 2.81

Случайное расположение До сортировки:

298 6179 5360 8197 9804 1173 8346 6670 7217 141

После сортировки:

0 1 1 2 2 4 5 6 7 8

Время: 8.56

Обратное расположение До сортировки:

10000 9999 9998 9997 9996 9995 9994 9993 9992 9991

После сортировки:

1 2 3 4 5 6 7 8 9 10

Время: 13.63

Метод быстрой сортировки

Идеальное расположение До сортировки:

1 2 3 4 5 6 7 8 9 10

После сортировки:

1 2 3 4 5 6 7 8 9 10

Время: 0.00

38

Случайное расположение До сортировки:

298 6179 5360 8197 9804 1173 8346 6670 7217 141

После сортировки:

 

 

0 1 1

2 2

4

5 6 7

8

 

Время: 0.00

 

 

 

Обратное расположение

 

До сортировки:

 

 

10000

9999 9998 9997 9996

9995 9994 9993 9992 9991

После сортировки:

 

 

1 2 3

4 5

6

7 8 9

10

 

Время: 0.00

 

 

 

Подведение итогов (время в секундах)

|----------------------------------------------

 

 

 

 

|

| Алгоритм | Идеальный | Случайный | Наихудший |

|----------------------------------------------

 

 

 

|

| Обмен

|

2.81|

8.56|

13.63|

| Хоор

|

0.00|

0.00|

0.00|

|----------------------------------------------

 

 

 

|

Реализация методов в среде Turbo-С++

#include <dos.h> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define amax 10000

// Метод сортировки обменами (алгоритм "пузырька") void sort_obmen(int m[amax])

{

int r,i,j;

for (i=2;i<=amax;i++) { for (j=amax;j>=i;j--) { if (m[j-1-1] > m[j-1])

{ r=m[j-1-1];m[j-1-1]=m[j-1];m[j-1]=r; }

}}

}

// Метод "быстрой" сортировки (алгоритм Хоора) void hoor(int m[],int l,int r)

{

int i,j,x,o; i=l;j=r;x=m[int(floor((l+r)/2))]; while (i<=j)

{

while (m[i-1] < x) {i++;} while (m[j-1] > x) {j--;}

39

if (i <= j) { o=m[i-1];m[i-1]=m[j-1];m[j-1]=o; i++;j--;}

}

if (l < j) {hoor(m,l,j);} if (i < r) {hoor(m,i,r);}

}

// Главная программа void main(void)

{

int a[3][amax],ns,i,k; float time[2][3],r1,r2; struct time t;

FILE *f; srand(1);

f=fopen("res_cpp.txt","w");

fprintf(f,"Сравнение двух методов сортировки в Турбо-C++\n\n"); // начинаем сортировку

for (ns=1;ns<=2;ns++) // два алгоритма

{

if (ns==1) {printf("Метод сортировки обменами\n"); fprintf(f,"Метод сортировки обменами\n");} else {printf("Метод быстрой сортировки\n");

fprintf(f,"Метод быстрой сортировки\n");}

//заполнение идеальными данными for (i=1;i<=amax;i++) {a[0][i-1]=i;}

//заполнение случайными данными

for (i=1;i<=amax;i++) {a[1][i-1]=abs(rand()%amax);}

// заполнение худшими данными

for (i=1;i<=amax;i++) {a[2][i-1]=amax+1-i;}

// сортировка

for (i=1;i<=3;i++)

{

switch (i) {

case 1: printf("Идеальное расположение\n"); fprintf(f,"Идеальное расположение\n");break;

case 2: printf("Случайное расположение\n"); fprintf(f,"Случайное расположение\n");break;

case 3: printf("Обратное расположение\n"); fprintf(f,"Обратное расположение\n");break;}

printf("До сортировки\n");fprintf(f,"До сортировки\n"); for (k=0;k<10;k++) {printf("%6i",a[i-1][k]);fprintf(f,"%6i",a[i-1][k]);} printf("\n");fprintf(f,"\n");

gettime(&t);

40