- •Функции.
- •Вызов функции с переменным числом параметров
- •Функция main и её параметры.
- •Директивы препроцессора (прекомпилера).
- •Объявление указателей.
- •Модификатор const.
- •Операции.
- •Указатели на различные типы.
- •Указатель на void.
- •Применение указателей для передачи данных между функциями.
- •Массивы.
- •Индексация массивов.
- •Хранение массива в памяти. Адреса элементов. Хранение массива в памяти.
- •Массивы и константные указатели.
- •Статическое и динамическое выделение памяти.
- •Функции calloc, malloc, free
- •Функция realloc
- •Передача массивов в качестве аргументов функции.
- •Указатели на функции.
- •Библиотеки функций.
- •Функции форматированного ввода-вывода.
- •Функция printf().
- •%[Флаги] [Ширина] [.Точность] [{h | l | I | i32 | i64}]тип
- •Для чего нужен форматированный вывод.
- •Функция scanf().
- •Функции sprintf() и sscanf().
- •Функции fprintf() и fscanf().
- •Функции неформатированного ввода-вывода.
- •Работа со строковыми данными (стрингами). Представление строковых данных в языке c.
- •Функции работы со строками.
- •Потоковый ввод-вывод
- •Функции форматированного ввода-вывода.
- •Функция printf().
- •%[Флаги] [Ширина] [.Точность] [{h | l | I | i32 | i64}]тип
- •Для чего нужен форматированный вывод.
- •Функция scanf().
- •Функции sprintf() и sscanf().
- •Функции fprintf() и fscanf().
- •Функции неформатированного ввода-вывода.
- •Функции работы с файлами.
- •Потоковый ввод-вывод
- •Работа с потоками
- •Курсор.
- •Ввод-вывод отдельных символов и строк.
- •Форматированный ввод-вывод информации в файл.
- •Блочный потоковый ввод-вывод
- •Смена текущей позиции в файле. Проверка конца файла.
- •Функции доступа к файлам нижнего уровня.
- •Методы сортировки данных.
- •Введение
- •Сравнение методов сортировки
- •Программная реализация алгоритмов сортировки
- •Метод пузырька.
- •Метод обмена.
- •Метод вставки.
- •Метод Шелла.
- •Метод кучи (бинарной кучи).
- •Очередь
- •Линейный список
- •Физическое (машинное) представление линейных списков
- •Программные реализации структур данных. Стек. Реализация в виде массива.
- •Стек. Связанное представление.
- •Очереди. Реализация в виде массива.
- •Дерево. Связанное представление.
- •Рекурсивный вызов функций.
- •Структуры. Объединения. Перечисления.
- •Перечисление (enum).
- •Производные типы данных.
- •Структура (struct).
- •Побитовое описание полей структуры.
- •Объявление переменных, реализующих структуру.
- •Доступ к элементам структуры.
- •Объединение (union).
- •Вложенное описание структур и объединений.
- •Описание структур и объединений в виде пользовательского типа.
- •Передача структур и объединений в виде параметров функции.
- •Инициализация структур и объединений.
- •Выгода от использования структур
Методы сортировки данных.
В общем виде задача сортировки данных может быть сформулирована следующим образом.
Пусть задан массив a, состоящий из N элементов некоторого типа T, называемого базовым типом этого массива:
T a[N];
Пусть также задана некоторая функция f от двух элементов этого же типа:
int compare(T a, T b);
Эта функция называется функцией сравнения двух элементов типа T, т.е. функцией, которая определяет, какой из этих элементов считать большим, а какой – меньшим. Функция сравнения однозначно определяет операцию сравнения. Соотношение элементов a и b связано с результатом функции f следующим образом:
compare(a, b)<0 a<b
compare(a, b)=0 a=b
compare(a, b)>0 a>b
Массив a называется отсортированным в соответствии с функцией compare (или отсортированным по критерию compare), если выполняется следующее правило:
i, j [0, N-1] : i < j a[i] < a[j]
Иными словами, в отсортированном массиве любой последующий элемент больше любого предыдущего элемента.
Как видно из данного определения, о сортировке массива имеет смысл говорить только тогда, когда на его базовом типе определена операция сравнения. Именно эту операцию и реализует функция compare. Задавая разные функции сравнения, можно по-разному определять операцию сравнения элементов массива и, тем самым, получать различное упорядочение его элементов.
Заметим, что не любая функция сравнения обеспечивает упорядочение массива. Для того чтобы массив можно было отсортировать, операция сравнения должна обладать свойствами транзитивности и коммутативности, т.е. должны выполняться следующие условия:
a < b & b < c a < c
a < b b > a
Операция сравнения может быть определена для самых разнообразных типов данных. Более того, для каждого типа данных она может быть определена различными способами. Например, массив целых чисел можно сортировать в порядке их возрастания, в этом случае функцию сравнения следует задать следующим образом:
int f(int a, int b)
{
return a – b;
}
А можно сортировать числа, скажем, в порядке возрастания суммы цифр в их десятичной записи. Строки символов можно сортировать в лексикографическом порядке, т.е. по алфавиту. Структуры, содержащие анкетные данные сотрудников фирмы, можно сортировать по фамилиям, именам, дате рождения и т.д. Трехмерные векторы можно сортировать по их длине. Такое перечисление можно продолжать бесконечно. Основной его мыслью является то, что базовый тип сортируемого массива и операцию сравнения на этом типе следует понимать предельно широко.
Метод сортировки массива – это некоторый алгоритм. Исходными данными для этого алгоритма является массив, об упорядочении элементов которого в общем случае ничего не известно, т.е. предполагается, что этот массив не отсортирован. Также на вход алгоритма сортировки подается функция сортировки. Задачей алгоритма сортировки является такое переупорядочение элементов массива, чтобы этот массив стал отсортированным в соответствии с заданной функцией сравнения. Этот отсортированный массив и является результатом работы алгоритма сортировки.