
- •Содержание отчета
- •Оценивание работы студента
- •1. Проектирование, написание и отладка программ, содержащих структуру выбора
- •1.1. Цель работы
- •1.2. Методические указания по подготовке к лабораторной работе
- •1.3. Контрольные вопросы
- •1.4. Содержание отчета
- •1.5. Варианты индивидуальных заданий
- •2. Программная реализация циклических вычислительных процессов
- •2.1. Цель работы
- •2.2. Методические указания по подготовке к лабораторной работе
- •2.3. Контрольные вопросы
- •2.4. Содержание отчета
- •2.5. Варианты индивидуальных заданий на оценку «хорошо»
- •2.6. Варианты индивидуальных заданий на оценку «отлично»
- •3. Обработка массивов
- •3.1. Цель работы
- •3.2. Методические указания по подготовке к лабораторной работе
- •3.3. Контрольные вопросы
- •3.4. Содержание отчета
- •3.5. Варианты индивидуальных заданий
- •4.4. Содержание отчета
- •4.5. Варианты индивидуальных заданий
- •5. Сортировка массивов
- •5.1. Цель работы
- •5.2. Методические указания по подготовке к лабораторной работе
- •5.3. Контрольные вопросы
- •5.4. Содержание отчета
- •5.5. Варианты индивидуальных заданий
5. Сортировка массивов
5.1. Цель работы
Цель работы – изучение алгоритмов сортировки массивов, сравнение их по быстродействию и затратам памяти, совершенствование практических навыков работы с массивами и функциями.
5.2. Методические указания по подготовке к лабораторной работе
Изучить теоретический материал: конспект лекций, методические указания к практическим занятиям по соответствующим темам, подготовить ответы на контрольные вопросы, составить алгоритм решения задания.
Задача сортировки массивов является широко распространенной и практически важной. Существует множество различных алгоритмов сортировки, различающихся по сложности, быстродействию, объему используемой памяти, типу сортируемых данных. Данная лабораторная работа посвящена изучению и практическому программированию трех относительно простых (но не самых быстрых) методов: пузырьковая сортировка, сортировка вставкой, блочная сортировка. Для определенности будем предполагать, что сортировка производится по возрастанию.
Задача сортировки массивов является широко распространенной и практически важной. Существует множество различных алгоритмов сортировки, различающихся по сложности, быстродействию, объему используемой памяти, типу сортируемых данных. Рассмотрим некоторые из них (не самые быстрые, но более доступные для понимания и программирования). Для определенности будем предполагать, что сортировка производится по возрастанию.
Пузырьковая сортировка.
Это наиболее простой метод сортировки. Пусть задан одномерный массив из n элементов. На каждом проходе последовательно сравниваются соседние элементы массива. Если последующий элемент x[i+1] меньше предыдущего x[i], то они меняются местами. Процедура обмена носит название "метод пустого стакана" и требует памяти объемом в один элемент массива: work=x[i]; x[i]=x[i+1]; x[i+1]=work;. На первом проходе производится n-1 сравнение (0 и 1, 1 и 2, ..., n-2 и n-1). После этого максимальный элемент будет последним в массиве (всплывает как пузырек). На втором проходе производится n-2 сравнения и т.д. Всего требуется n-1 проход. Таким образом, всего требуется (n2-n)/2 сравнений и в среднем (n2-n)/4 операций обмена. Это очень много. Достоинствами пузырьковой сортировки являются наименьший среди всех алгоритмов расход памяти (2 переменных цикла и переменная work для обмена), простота и универсальность (метод применим для массивов с любыми типами данных). Функция BubbleSort, реализующая этот метод имеет вид:
void BubbleSort(int x[], const int n) {
for(int k=0;k<n-1;k++)
for(int i=0;i<n-k-1;i++)
if(x[i+1]<x[i]) {
int work=x[i];
x[i]=x[i+1];
x[i+1]=work;
}
return;
}
Сортировка вставкой.
Пусть задан одномерный массив из n элементов. Объявим вспомогательный одномерный массив из 2n-1 элементов. Поместим первый элемент исходного массива в середину вспомогательного массива (y[n-1]=x[0]). Нижняя и верхняя границы вспомогательного массива (bottom и top) станут равными n-1. Для вставки всех последующих элементов исходного массива используется следующая двухшаговая процедура:
Для вставляемого элемента x[i] находится его позиция в вспомогательном массиве. Для этого необходимо использовать функцию BinSearch, реализующую двоичный поиск в отсортированном массиве, которая принимает массив (y), его границы (bottom и top), вставляемый элемент (x) и возвращает позицию элемента x в массиве y.
Элемент x[i] вставляется в массив y на найденную позицию. Функция, реализующая эту вставку, может сдвигать элементы массива y или вверх, или вниз, смотря в какую сторону "дешевле" (т.е. меньше элементов необходимо сдвинуть).
После вставки последнего элемента массива x данные при необходимости переписываются из вспомогательного массива в исходный.
Метод вставки относится к методам неразрушающей сортировки, что иногда является существенным достоинством. Этот метод быстрее пузырьковой сортировки, но сложнее и требует больше памяти.
Блочная сортировка.
Пусть задан массив целых положительных чисел из n элементов. Объявим вспомогательный двумерный массив (матрицу) для сортируемых данных размером [10строк]*[n столбцов] и массив индексов (размером 10), в котором хранится количество заполненных элементов матрицы в соответствующей строке. На каждом проходе последовательно выполняются два основных шага:
Распределяющий проход. Каждый элемент одномерного массива x[i] помещается в строку матрицы с номером, совпадающим со значением первого (младшего) десятичного разряда этого элемента (т.е. в строку с номером x[i]%10).
Собирающий проход. Элементы матрицы построчно переписываются в исходный одномерный массив.
На втором проходе аналогичным образом обрабатываются вторые разряды (десятки), затем сотни и т.д. При этом отсутствующие разряды заменяются нулями (3–>03–>003...).
Количество проходов определяется количеством разрядов наибольшего элемента из сортируемого массива. Эту величину необходимо определить в начале сортировки (с помощью отдельной функции). Очевидно, что число 10 как основание системы счисления выбрано произвольно.
Этот метод быстрее предыдущих, но он требует намного больше памяти и применим только к массивам из целых положительных чисел.