
- •1. Информатика как дисциплина
- •2. Сигналы, данные, информация.
- •3. Информация. Свойства информации: объективность, полнота, достоверность.
- •4. Информация. Свойства информации: адекватность, доступность, актуальность.
- •5. Данные. Операции с данными.
- •6. Операционные системы: ms-dos, Windows, unix, Linux. Macintosh.
- •7. Системы счисления. Позиционные и не позиционные системы счисления.
- •8. Системы счисления. Десятичная, двоичная, восьмеричная. Шестнадцатеричная системы счисления. Правила записи чисел.
- •9. Системы счисления. Правила перевода из десятичной системы счисления в двоичную и обратно.
- •10. Системы счисления. Правила перевода из восьмеричной системы в двоичную и обратно.
- •11. Системы счисления. Правила перевода из шестнадцатеричной системы в двоичную и обратно.
- •12. Числа в двоичном коде. Прямой, обратный и дополнительный коды.
- •13. Операции над числами в двоичном коде. Логическое и арифметическое сложение.
- •14. Операции над числами в двоичном коде. Умножение.
- •15. Операции над числами в двоичном коде. Вычитание (сложение с обратным знаком).
- •16. Единицы измерения информации.
- •Единицы измерения количества информации - Применяются для измерения количества информации в объёме данных.
- •17. Алгоритмы. Виды алгоритмов.
- •18. Алгоритмы. Построение блок-схем алгоритмов.
- •20. Структура программы в языке FreePascal.
- •22. Типы данных, используемые в языке Free Pascal. Целочисленный и вещественный типы и возможные операции с ними.
- •24. Тины данных, используемый в языке Free Pascal. Логический и литерный типы и возможные операции с ними.
- •25. Типы данных, используемые в языке Free Pascal. Строковый типы и возможные операции для работы с литерной строкой.
- •Операции
- •26. Операторы ввода/вывода в языке FreePascal.
- •Оператор ввода read
- •Оператор вывода write
- •27. Оператор условия (ветвления). Его параметры, синтаксис.
- •[Править]Реализация [править]Algol, Pascal
- •28. Оператор выбора (case of). Его параметры, синтаксис.
- •Примеры использования
- •29. Циклы. Цикл с параметром (for). Параметры, синтаксис.
- •30. Циклы. Бесконечный цикл с предусловием (while). Параметры, синтаксис.
- •31. Циклы. Бесконечный цикл с послесловием (repeat until). Параметры, синтаксис
- •32. Массивы. Способы задания одномерных массивов.
- •33. Массивы Способы задания многомерных массивов.
- •Двумерные массивы. Матрицы.
- •Объявление и инициализация матрицы.
- •34. Понятие сортировки. Алгоритмы сортировки.
- •Пузырьковая сортировка
- •Сортировка выбором
- •Сортировка Шелла
- •Сортировка Хоора
- •Сортировка с помощью двоичного дерева
- •Сортировка с помощью массива индексов
- •Алгоритмы устойчивой сортировки
- •Алгоритмы неустойчивой сортировки
- •35. Понятое сортировки. Сортировка методом пузырька.
- •Сортировка простым обменом. Метод пузырька.
- •36. Понятие сортировки. Сортировка методом прямого выбора.
- •37. Генерация псевдослучайных чисел в языке Free Pascal. Функции inc. Dec. Odd.
- •Процедура Inc.
- •Процедура Dec.
- •Функция Odd.
- •38. Директивы компилятора.
- •39. Сортировка массивов методом пузырька.
- •40. Сортировка массивов методом прямого выбора.
- •41. Процедуры и функции. Сходства, отличия.
- •Описание и вызов процедур и функций
- •42. Процедуры и функции. Локальные и глобальные переменные.
- •43. Функции. Описание функций в программе.
- •Формат описания функции
- •Правила исполнения функции
- •Формат оператора return
- •Правило исполнения оператора return
- •44. Системные функции div. Mod.
- •45. Процедуры. Описание процедур в программе.
- •46. Модули. Описание модулей. Работа с модулями.
- •Interface – зарезервированное слово (интерфейс); начинает интерфейсную часть модуля;
- •Implementation – зарезервированное слово (выполнение); начинает исполняемую часть модуля;
Сортировка с помощью двоичного дерева
Двоичным деревом назовем упорядоченную структуру данных, в которой каждому элементу -- предшественнику или корню (под)дерева -- поставлены в соответствие по крайней мере два других элемента (преемника). Причем для каждого предшественника выполнено следующее правило: левый преемник всегда меньше, а правый преемник всегда больше или равен предшественнику. Если мы составим такое дерево из букв слова "СОРТИР", сравнивая ASCII коды букв, то получим следующую структуру:
С
/ \
О Т
/ \
И Р
Как видно, узел "С" имеет два преемника: левый "О" и правый "Т". Если составить бинарное дерево из элементов неупорядоченного массива, то в общем случае дерево получится достаточно хорошо заполненным (а если массив уже был рассортирован, то дерево выродится в линейный список). Если мы будем обходить дерево по правилу "ЛЕВЫЙ преемник - КОРЕНЬ - ПРАВЫЙ преемник", то, записывая все встречающиеся элементы в массив, мы получим упорядоченное в порядке возрастания множество. На этом и основана идея сортировки деревом.
Использование такой сортировки удобно тогда, когда удобно представлять данные в виде дерева.
Недостаток метода - требуется много памяти. В приведеном примере - дополнительный мегабайт данных на каждые 256k элементов.
/*********** сортировка с помощью двоичного дерева *************/
typedef struct tree
{
int a; // данные
struct tree *left; // левый преемник
struct tree *right; // правый преемник
} TREE;
TREE *add_to_tree(TREE *root, int new_value)
{
if (root==NULL) // если дошли до корня - создаем новый элемент
{
root = (TREE*)malloc(sizeof(TREE));
root->a = new_value;
root->left = root->right = 0;
return root;
}
if less(root->a, new_value) // добавлем ветвь
root->right = add_to_tree(root->right, new_value);
else
root->left = add_to_tree(root->left, new_value);
return root;
}
void tree_to_array(TREE *root, int a[]) // процедура заполнения массива
{
static max2=0; // счетчик элементов нового массива
if (root==NULL) return; // условие окончания - найден корень
tree_to_array(root->left, a); // обход левого поддерева
a[max2++] = root->a;
tree_to_array(root->right, a); // обход правого поддерева
free(root);
}
void sort_tree(int a[], int max) // собственно сортировка
{
TREE *root = 0;
for (int i=0; i<max; i++) // проход массива и заполнение дерева
root = add_to_tree(root, a[i]);
tree_to_array(root, a); // заполнение массива
}
Сортировка с помощью массива индексов
Это не столько метод, сколько хинт для ускорения любого метода сортировки, когда в качестве данных используются структуры большого размера.
Идея заключается в том, что параллельно с основным массивом данных существует так называемый массив индексов, через который осуществляется перестановка индексов основного массива данных.
struct XPEH a[10000]; // основной массив
int index[10000]; // массив индексов {0,1,2,...,9999}
Перед сортировкой массив индексов инициализируется соответствующими порядковыми номерами.
Доступ к массиву данных ведется не как a[i], а как a[index[i]], и функция сравнения теперь выглядит иначе:
#define less(i,j) (a[index[i]].XPEH_member < a[index[j]].XPEH_member)
В результате фактически сортируется массив с индексами, а не с данными.
void sort_quick_index(XPEH a[], int index[], int l, int r)
{
int i=l, j=r, x=(l+r)/2; // теперь x не элемент а его индекс
do {
while (less(i,x)) i++;
while (less(x,j)) j--;
if (i<=j)
{
if (x==i) x==j; else if (x==j) x==i;
swap(index[i], index[j]); // сортируем индексы
i++;
j--;
};
} while (i<j);
if (l<j) sort_quick_index(a,index,l,j);
if (i<r) sort_quick_index(a,index,i,r);
}