- •35 Жегуло а.И. Компьютерные науки 2010-2011 гг. Компьютерные науки Лекции для студентов 1 курса, 2010-2011 уч. Г., семестр 1
- •1. Основные понятия 3
- •2. Введение в язык программирования Pascal 3
- •7. Массивы 16
- •8. Сортировки массивов 22
- •9. Рекурсия 25
- •1. Символьные и строковые типы данных 31
- •Основные понятия
- •Способы описания алгоритма:
- •Введение в язык программирования Pascal
- •Структура программы на языке Pascal
- •Правила записи программ
- •Стиль программирования
- •Переменные и константы. Понятие типа данных
- •Классификация типов данных
- •Стандартные простые типы данных
- •Целые типы
- •Вещественные типы
- •Логические (булевские) типы
- •Перечисляемые типы
- •Интервальные типы
- •Порядковые типы
- •Описание данных
- •Описание переменных
- •Описание констант
- •Описание типизированных констант
- •Выражения
- •Операции отношения
- •Приоритеты операций
- •Арифметические выражения
- •Логические выражения
- •Операторы
- •Оператор присваивания
- •Оператор ввода с клавиатуры
- •Оператор вывода на экран монитора
- •Форматный вывод
- •Условный оператор (оператор альтернативы)
- •Составной оператор
- •Оператор выбора
- •Оператор цикла с предусловием while
- •Оператор цикла с постусловием repeat
- •Оператор цикла for с параметром
- •Вложенные циклы
- •Взаимозаменяемость циклов различных видов
- •Дополнительные конструкции переходов для циклов
- •«Вечные» циклы
- •Простейшие алгоритмы
- •Вычисление суммы и произведения
- •Организация счетчика
- •Нахождение наибольшего и наименьшего значений
- •Рекуррентные последовательности
- •Итерационные алгоритмы
- •Подпрограммы (процедуры и функции)
- •Понятие подпрограммы, ее описания и вызова
- •Цели введения подпрограмм
- •Способы передачи параметров. Виды параметров
- •Параметры-значения
- •Параметры-переменные
- •Параметры-константы
- •Корректность передачи параметров
- •Досрочное завершение работы программы и подпрограммы
- •Реализация вызова подпрограммы
- •Область действия и время жизни идентификаторов
- •Правила видимости
- •Время жизни идентификаторов
- •Побочный эффект функции
- •Массивы
- •Описание переменных-массивов
- •Обозначение элементов массива
- •Двумерные массивы – матрицы
- •Трехмерные массивы
- •Типизированные константы-массивы
- •Операции над массивами
- •Именная эквивалентность типов
- •Передача массива в качестве параметра
- •Открытые массивы
- •Типичные задачи для одномерных массивов
- •Поиск заданного элемента в массиве
- •Анализ методов поиска по количеству операций сравнения
- •Двумерные массивы – матрицы
- •Трехмерные массивы
- •Сортировки массивов
- •Понятие сортировки
- •Параметры оценки алгоритмов
- •Сортировка простым включением (простыми вставками) Принцип сортировки включением
- •Сортировка простым выбором Принцип сортировки выбором
- •Сортировка простым обменом (метод пузырька) Принцип сортировки обменом
- •Сравнение эффективности базовых методов сортировки
- •Использование индексных массивов при сортировке
- •Рекурсия
- •Что такое рекурсия
- •Рекурсивные подпрограммы
- •Прямая и косвенная рекурсия
- •Предварительное (опережающее) описание подпрограммы
- •Опасности рекурсии
- •Бесконечная рекурсия
- •Итерация и рекурсия. Необоснованное применение рекурсии
- •Глубокая рекурсия
- •Когда использовать рекурсию
- •Формы рекурсивных подпрограмм
- •Примеры рекурсивных программ
- •Ввод последовательности целых чисел, заканчивающейся нулем, вывод в обратном порядке
- •Поиск максимального элемента массива
- •Задача о Ханойских башнях
- •Символьные и строковые типы данных
- •Символьные типы данных
- •Представление символов в памяти компьютера
- •Символьные константы и переменные Неименованные символьные константы
- •Стандартные функции над символами
- •Строковые типы данных
- •Строковые типы. Представление строк в памяти компьютера
- •Стандартные функции и процедуры для строк
- •Выделение слов из строки
-
Примеры рекурсивных программ
-
Ввод последовательности целых чисел, заканчивающейся нулем, вывод в обратном порядке
-
Program Reverse;
procedure Rev;
var n: integer;
begin
readln(n); {ввод чисел на рекурсивном спуске}
if n<>0 then Rev; {условный рекурсивный вызов}
writeln(n) {вывод чисел на рекурсивном возврате}
end;
begin Rev end.
Допустим, ввели последовательность: 5 7 2 0
Вывод после завершения ввода будет в обратном порядке: 2 7 5
-
Поиск максимального элемента массива
Суть рекурсивного поиска максимума – длина части массива, на которой ведется поиск, на каждом шаге рекурсивного спуска уменьшается на 1. Когда эта длина станет равной 1, принимаем за максимальный этот единственный рассматриваемый на данном шаге рекурсии элемент.
Больше рекурсивных вызовов не происходит, начинается завершение работы вызванных функций, т.е. рекурсивный возврат. На каждом шаге рекурсивного возврата к уже обработанной части массива добавляется один элемент. Если этот элемент A[L] больше найденного ранее максимума, то значение A[L] принимается за новое значение максимума.
program Max_vector;
const N=10;
type vector=array[1..N] of integer;
var V:vector;
function RMax(const A:vector; L:integer):integer;
{Рекурсивная функция поиска максимального элемента в массиве A, который передается как константа.
L – длина части массива, рассматриваемой на каждом шаге рекурсии.}
var M: integer;
begin
if L=1 then RMax:=A[1] {Считаем A[1] максимальным; рекурсивный спуск закончен}
else begin
M:=RMax(A, L-1); {Уменьшение длины части массива на 1 на рекурсивном спуске}
if A[L]>M then RMax:=A[L] {Сравнение на рекурсивном возврате}
end
end;
begin
{Ввод элементов массива V} … ;
writeln('Максимум, найденный рекурсивно: ', RMax(V, N));
end.
-
Быстрая сортировка – усовершенствованный метод сортировки обменом
Алгоритм быстрой сортировки, который разработал английский информатик Чарльз Хоор (C. Hoare) в 1960 г., является наиболее популярным алгоритмом сортировки.
Анализ эффективности быстрой сортировки
В среднем число операций порядка Nlog2N, остальные сортировки в среднем N2 операций.
Преимущество быстрой сортировки проявляется при больших N. Она сортирует массив с элементами в обратном порядке практически с такой же скоростью, как уже отсортированный.
Принцип быстрой сортировки
Причина неэффективности метода сортировки обменом (метод «пузырька») в том, что меняются местами два соседних элемента, если для них нарушена упорядоченность. Менять местами надо максимально удаленные элементы.
Алгоритм одного шага быстрой сортировки
-
Положить i=1, j=N
-
Выберать в массиве случайным образом элемент x.
-
Повторять
Просматривая массив слева направо, найти элемент Ai > x.
Просматривая массив справа налево, найти элемент Aj < x.
Если i<=j, то поменять местами Ai и Aj, увеличить i+1, уменьшить j-1
-
Конец повторения
Чтобы отсортировать массив полностью, надо то же самое сделать с обеими частями (слева и справа от x), затем с частями этих частей и т.д. до тех пор, пока каждая часть не будет содержать только один элемент. Получили рекурсивный алгоритм.
Пример одного шага быстрой сортировки (см. рисунок).
program QuickSort; //Быстрая сортировка. В качестве x в каждом подмассиве выбирается средний элемент
Const N=100;
var A: array[1..N] of integer;
i: integer;
procedure QSort(L,R:integer); //L, R – индекс самого левого и самого правого элементов подмассива
var i,j,x,w:integer;
begin
i:=L; j:=R;
x:=A[(L+R) div 2]; //x - средний элемент
repeat
while A[i]<x do i:=i+1; //Просмотр слева направо
while A[j]<x do j:=j-1; //Просмотр справа налево
if i<=j then
begin //Перестановка A[i] и A[j]
w:=A[i];
A[i]:=A[j];
A[j]:=w;
i:=i+1; j:=j-1
end
until i>j;
if L<j then QSort(L,j); //Рекурсивный вызов для левой половины массива
if i < R then QSort(i,R) //Рекурсивный вызов для правой половины массива
end; {конец процедуры QSort}
begin
… {Ввод значений в массив A}
Sort(1,N);
… {Вывод отсортированного массива}
end.