- •Министерство образования Российской федерации новосибирский государственный технический университет
- •Часть 1
- •Работа подготовлена на кафедре
- •Последовательность этапов решения задач при нисходящем проектировании
- •Семь основных элементов программирования.
- •Другие функции вывода: puts() и putchar()
- •Типы данных
- •Использование gets() и getch() для ввода
- •Условные операторы
- •Операции сравнения
- •Логические операции
- •Операторы присваивания
- •Оператор запятая
- •Лабораторная работа № 1 условные операторы. Операторы цикла.
- •Цель работы
- •Общие положения Оператор if
- •Циклические конструкции в программах
- •3. Пример программной реализации
- •4. Варианты заданий
- •5. Контрольные вопросы.
- •Лабораторная работа № 2 массивы целых чисел. Символьные массивы.
- •1. Цель работы.
- •2. Общие положения.
- •3. Примеры программных реализаций
- •Пример 3. Введенное натуральное число записать в виде строки.
- •4. Варианты заданий
- •5. Контрольные вопросы
- •Лабораторная работа № 3 методы сортировки.
- •Цель работы
- •Общие положения
- •Сортировка простыми включениями.
- •Сортировка простым выбором.
- •Сортировка простым обменом.
- •Пример программной реализации
- •Варианты заданий.
- •Лабораторная работа № 4
- •Способы передачи параметров
- •Функция main()
- •Области действия функций. Определения и объявления
- •Примеры программных реализаций
- •Варианты заданий
- •Контрольные вопросы
- •Лабораторная работа № 5 функции. Массивы указателей.
- •Цель работы
- •Общие положения
- •Примеры программных реализаций
- •Варианты заданий
- •Контрольные вопросы
Сортировка простыми включениями.
Элементы условно разделяют на готовую последовательность а1, … , а i–1 и входную последовательность а i, … , а n. На каждом шаге, начиная с i = 2 и увеличивая i на единицу, берут i – ый элемент входной последовательности и передают в готовую последовательность, помещая его на подходящее место. Алгоритмы сортировки простыми включениями (метод «погружения» и метод «включения») выглядят следующим образом:
void Sort_Load (int m[],int n)
{
int c, i, j;
for (i = 1; i < n; i ++)
for (j = i; j!= 0; j --)
{
if(m[j] > m[j-1]) break;
c = m[j];
m[j] = m[j–1];
m[j–1] = c;
}
}
void Sort_Includ (int m[],
int n)
{
int c, i, j, k;
for (i = 1; i < n; i ++)
for(j = 0; j < i; j ++)
if (m[i] < m[j])
{c = m[i];
for(k = i;k != j;k --)
m[k] = m[k – 1];
m[j] = c;
}
}
При поиске подходящего места удобно чередовать сравнения и пересылки, то есть как бы «просеивать» х, сравнивая его с очередным элементом а j и либо вставляя х, либо пересылая аj направо и продвигаясь налево. «Просеивание» может закончиться при двух различных условиях: найден элемент аj с ключом, меньшим, чем х; достигнут левый конец готовой последовательности.
Анализ сортировки простыми включениями. Число С i сравнений ключей при i-ом просеивании составляет самое большее i-1, самое меньшее 1 и, если предположить, что все перестановки n ключей равновероятны, в среднем равно i/2. Число М i пересылок (присваиваний) равно Сi+2. Поэтому общее число сравнений пересылок следующее
C min = n – 1 M min = 2 (n - 1)
C ср. = ¼ (n2 + n – 2 ) M ср. = ¼ (n2 + 9n - 10)
C max = ½ (n2 + n) – 1 M max = ½ (n2 + 3n - 4)
Наименьшие числа появляются, если элементы с самого начала упорядочены, а наихудший случай – если элементы расположены в обратном порядке. В этом смысле сортировка включениями демонстрирует вполне естественное поведение. Данный алгоритм описывает устойчивую сортировку: он оставляет неизменным порядок элементов с одинаковыми ключами. Однако, включение элемента с последующим сдвигом всего ряда элементов на одну позицию неэкономна. Лучших результатов можно ожидать от метода, при котором пересылка элементов выполняется только для отдельных элементов и на большие расстояния. Речь идет о сортировке выбором.
Сортировка простым выбором.
Метод основан на следующем правиле: выбирается элемент с наименьшим ключом, он меняется местами с первым элементом; затем эти операции повторяются с оставшимися n – 1 элементами, затем с n – 2 элементами, пока не останется только один элемент – наибольший. Алгоритм сортировки можно представить следующим образом:
void Sort_Select (int m[], int n)
{
int i, j, c, k ;
for ( i = 0; i < n - 1; i ++)
{k = i;
for( j = i + 1; j < n; j ++)
if ( m[j] < m[k] ) k = j;
c = m[k]; m[k] = m[i]; m[i] = c;
}}
Анализ сортировки простым выбором. Число сравнений ключей
C = ½ (n2 - n) не зависит от начального порядка ключей. Минимальное число пересылок равно M min = 3 (n - 1) в случае изначально упорядоченных ключей и принимает наибольшее значение M max = trunc (n2/4) + 3 (n - 1), если вначале ключи расположены в обратном порядке. M ср. = n (ln n + 0.57).