- •Программирование на языке Паскаль
- •Основы визуального программирования 67
- •Введение. Структура программы. Типы данных
- •Структура программы в зыке Паскаль
- •Комментарии
- •Раздел описания переменных
- •Имена идентификаторов в языке Паскаль
- •Типы данных в языке Паскаль
- •Вещественные типы
- •Целые типы
- •Оператор ввода
- •Составной оператор
- •Условный оператор
- •Выражения
- •Арифметические операции
- •Логические выражения
- •Логические операции
- •Приоритеты операций
- •Стандартные математические и арифметические функции
- •Структурированные операторы
- •Оператор выбора case
- •Оператор цикла for
- •Оператор цикла while
- •Inc(n); { Увеличение значения пременной n на 1 }
- •Оператор цикла repeat
- •Тип массив
- •Строковый тип
- •Процедуры и функции для работы со строками
- •Типизированные константы
- •Процедуры и функции
- •Обращение к процедурам и функциям
- •Процедуры и функции. Процедурные типы. Тип указатель
- •Модификаторы var и const в описании формальных параметров
- •Локальность и область действия
- •Процедурные типы
- •Тип указатель
- •Нулевой указатель
- •Работа с текстовыми файлами. Тип запись. Алгоритмы сортировки
- •Файловые типы
- •Процедуры и функции для работы с текстовыми файлами
- •Стандартные текстовые файлы
- •Тип запись
- •Обращение к элементам записи
- •Алгоритмы сортировки
- •Алгоритмы сортировки
- •Алгоритмы сортировки сравнениями
- •Объектно-ориентированное программирование. Структура программного модуля
- •Тип данных «объект»
- •Тип данных «класс»
- •Классификация стилей программирования
- •Структура программного модуля
- •Основы визуального программирования
- •Элемент управления «Поле ввода»
- •Элемент управления «Кнопка»
- •Элемент «Метка»
- •Элемент «Группа переключателей»
- •0:ShowMessage('Выбран вариант 1');
- •1:ShowMessage('Выбран вариант 2');
- •2:ShowMessage('Выбран вариант 3');
- •Основы визуального программирования
- •Элемент «Изображение»
- •Виды изображений
- •Класс tPicture
- •Класс tBitmap
- •Оператор with
- •Класс tCanvas
- •Библиографический список
- •620002, Екатеринбург, Мира, 19
Тип запись
Синтаксис
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;
Обращение к элементам записи
Осуществляется с помощью оператора « . » (точка).
Пример
D.Day:=23;
D.Month:=Oct;
D.Year:=2002;
S[5].Fam:='Иванов';
S[5].Fakultet:=MM;
Переменные одного и того же типа «запись» можно присваивать друг другу:
Пример
S[4]:=S[5];
Таким образом, тип «запись» позволяет группировать данные различного типа в одной переменной (или, например, в одном элементе массива).
Раз уж речь зашла о списках, необходимо сказать об их сортировке (например, необходимо отсортировать вышеописанный список студентов по алфавиту). Рассмотрим кратко, какие вообще существуют алгоритмы сортировки, их характеристики.
-
Алгоритмы сортировки
Алгоритмы сортировки
Все алгоритмы сортировки можно поделить на две группы: сортировка сравнениями и лексикографическая сортировка. Эти два вида алгоритмов отличаются тем, что при сортировке сравнениями неизвестна внутренняя структура объектов. При этом они вообще могут иметь различную структуру, необходимо только уметь сравнивать объекты друг с другом (например, числа). На самом деле только одного сравнения объектов недостаточно, оно должно обладать еще некоторыми дополнительными свойствами, например транзитивностью, т.е. если 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. Если текущий элемент больше следующего, то поменять их местами.
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;
UNTIL Stop;
