Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АПр лб 2008.doc
Скачиваний:
8
Добавлен:
12.11.2018
Размер:
680.45 Кб
Скачать

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 как основание системы счисления выбрано произвольно.

Этот метод быстрее предыдущих, но он требует намного больше памяти и применим только к массивам из целых положительных чисел.