Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции 1.doc
Скачиваний:
34
Добавлен:
22.02.2015
Размер:
1.94 Mб
Скачать
        1. Тип запись

 Синтаксис

RECORD

<Список имен 1>:<Тип 1>;

<Список имен 2>:<Тип 2>;

∙ ∙ ∙

<Список имен N>:<Тип N>;

END

При описании переменной типа «запись» в памяти создается последовательность переменных различного типа (сравните с типом массив, который описывает последовательность переменных одного типа).

 Пример

TYPE

Date=RECORD

Day:1..31;

Month:(Jan,Feb,Mar,…,Nov,Dec);

Year:Integer;

END;

Student=RECORD{ К примеру со списком студентов}

Fam,Name,Pat:STRING;

Fakultet:(MM,RT,MT,FT, … );

Group:Integer;

END;

VAR

D:Date;

S:ARRAY [1..100] OF Student;

        1. Обращение к элементам записи

Осуществляется с помощью оператора « . » (точка).

 Пример

D.Day:=23;

D.Month:=Oct;

D.Year:=2002;

S[5].Fam:='Иванов';

S[5].Fakultet:=MM;

Переменные одного и того же типа «запись» можно присваивать друг другу:

 Пример

S[4]:=S[5];

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

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

      1. Алгоритмы сортировки

        1. Алгоритмы сортировки

Все алгоритмы сортировки можно поделить на две группы: сортировка сравнениями и лексикографическая сортировка. Эти два вида алгоритмов отличаются тем, что при сортировке сравнениями неизвестна внутренняя структура объектов. При этом они вообще могут иметь различную структуру, необходимо только уметь сравнивать объекты друг с другом (например, числа). На самом деле только одного сравнения объектов недостаточно, оно должно обладать еще некоторыми дополнительными свойствами, например транзитивностью, т.е. если a<b иb<c, то должно бытьa<c. Предположим, что мы должны сравнивать вектора фактически являющиеся парами чисел видаr=(x,y). Определим операцию сравнения двух объектовr1=(x1,y1) иr2=(x2,y2) так:r1<r2 тогда и только тогда, когдаx1<x2 илиy1<y2. Удовлетворяет ли такое сравнение вышеприведенному условию? Возьмем 3 вектора:a=(3,9),b=(4,7),c=(1,8). По описанному способу сравнения получаем:a<b,b<c, ноa не меньшеc. Таким образом, при выборе этого отношения порядка не в каждом случае можно упорядочить заданную последовательность элементов.

Лексикографическая сортировка обычно применяется при сортировке объектов с известной внутренней структурой. Например, упорядочивание текстовых строк по алфавиту. Внутренняя структура строк известна: строка состоит из символов; количество символов алфавита ограничено.

        1. Алгоритмы сортировки сравнениями

Рассмотрим один из простейших алгоритмов сортировки сравнениями: так называемую пузырьковую сортировку.

 Алгоритм «Пузырьковая сортировка»

1. Повторять:

А. Для всех элементов списка, кроме последнего, повторять:

1. Если текущий элемент больше следующего, то поменять их местами.

2. Конец цикла при условии, что ни одной замены не произошло.

Проиллюстрируем работу алгоритма на примере последовательности из 5-ти чисел: 5, 3, 1, 4, 2. Работа алгоритма пузырьковой сортировки проиллюстрирована на следующем рисунке.

5┐

3

3

3

3

3┐

1

1

1

1

1

1

1

1

1

3┘

5┐

1

1

1

1┘

3

3

3

3

3

3┐

2

2

2

1

1┘

5┐

4

4

4

4

4┐

2

2

2

2┘

3

3

3

4

4

4┘

5┐

2

2

2

2┘

4

4

4

4

4

4

4

2

2

2

2┘

5

5

5

5

5

5

5

5

5

5

5

Видно, что на каждом шаге внешнего цикла самый большой элемент перемещается в конец списка. При этом не обязательно просматривать весь список каждый раз, так как на каждом шаге последний элемент оказывается на своем месте. В связи с этим на каждом шаге можно просматривать на один элемент меньше, и алгоритм можно модифицировать.

 Алгоритм «Пузырьковая сортировка»

1. Присвоить переменной k количество элементов списка.

2. Повторять:

А. Уменьшить k на 1.

Б. Для первых k элементов списка повторять:

1. Если текущий элемент больше следующего, то поменять их местами.

3. Конец цикла, при условии, что ни одной замены не произошло.

Сколько времени будет выполняться такая сортировка? За элементарную операцию примем операцию сравнения двух элементов и подсчитаем, сколько таких операций необходимо произвести, если дан список из n элементов. На каждом шаге будет просматриваться на один элемент меньше. В худшем случае (когда исходный массив отсортирован по убыванию) каждый раз будет производиться хотя бы один обмен элементов, пока не останется только один элемент, и сортировку не закончится. На первом шаге будет сделаноn-1 сравнение, на второмn-2 сравнения, и т.д. до одного сравнения. Итого, имеем арифметическую прогрессию от 1 доn-1 сn-1 элементом. Сумма этой прогрессии:

.

При больших значениях n эта функция ведет себя какn2. В таком случае говорят, что вычислительная сложность алгоритма равнаO(n2). Эта оценка вычислительной сложности алгоритма называется асимптотической. Такая оценка обычно является достаточно плохой. Возникают вопросы: можно ли написать алгоритм, который будет работать быстрее и какой самый быстрый алгоритм вообще можно написать? Ответ – можно, и это . Невозможно написать более быстрый алгоритм сортировки сравнениями. Для лексикографической сортировки наиболее быстрый алгоритм имеет вычислительную сложность .

При сортировке для обмена элементов списка можно использовать дополнительную переменную.

 Пример (см. пример из параграфа 6.4)

VAR

Temp:Student;

k,i:Integer;

Stop:Boolean;

. . .

{ Сортировка массива Sсо списком студентов по фамилии. Пусть длина списка задана переменнойn}

k:=n;

REPEAT

Dec(k);

Stop:=True;

FOR i:=1 TO k DO

IF S[i].Name>W[i+1].Name THEN

BEGIN

Temp:=S[i];

S[i]:=S[i+1];

S[i+1]:=Temp;

Stop:=False;

END;

UNTILStop;