Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Сортировка.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
155.94 Кб
Скачать

Содержание

  1. Понятие сортировки

  2. Методы сортировки

    1. Внутренние сортировки

      1. Сортировка слиянием

      2. Пирамидальная сортировка

      3. Метод Хоара

    2. Внешние сортировки

      1. Прямым слиянием

      2. Естественное слияние

      3. Сбалансированное многопутевое слияние

  3. Список использованной литературы

  1. Понятие сортировки

Сортировка - перестановка элементов в подмножестве данных по какому-либо критерию. Чаще всего в качестве критерия используется некоторое числовое поле, называемое ключевым. Цель сортировки — облегчить последующий поиск элементов в отсортированном множестве при обработке данных.

Все алгоритмы сортировки делятся на:

  • алгоритмы внутренней сортировки (сортировка массивов);

  • алгоритмы внешней сортировки (сортировка файлов).

Внутренняя сортировка оперирует массивами, целиком помещающимися в оперативной памяти с произвольным доступом к любой ячейке. Данные обычно упорядочиваются на том же месте без дополнительных затрат. (Примечание: В современных архитектурах персональных компьютеров широко применяется подкачка и кэширование памяти. Алгоритм сортировки должен хорошо сочетаться с применяемыми алгоритмами кэширования и подкачки).

Внутренняя сортировка – это алгоритм сортировки, который в процессе упорядочивания данных использует только оперативную память (ОЗУ) компьютера.

Внешняя сортировка – это алгоритм сортировки, который при проведении упорядочивания данных использует внешнюю память, как правило, жесткие диски. Внешняя сортировка разработана для обработки больших списков данных, которые не помещаются в оперативную память. Обращение к различным носителям накладывает некоторые дополнительные ограничения на данный алгоритм: доступ к носителю осуществляется последовательным образом, то есть в каждый момент времени можно считать или записать только элемент, следующий за текущим; объем данных не позволяет им разместиться в ОЗУ.

Внешняя сортировка – это алгоритм сортировки, который при проведении упорядочивания данных использует внешнюю память, как правило, жесткие диски.

Метод «Разделяй и властвуй» (англ. divide and conquer) в информатике — важная парадигма разработки алгоритмов, заключающаяся в рекурсивном разбиении решаемой задачи на две или более подзадачи того же типа, но меньшего размера, и комбинировании их решений для получения ответа к исходной задаче; разбиения выполняются до тех пор, пока все подзадачи не окажутся элементарными.

  1. Методы сортировки

    1. Внутренние сортировки

      1. Сортировка слиянием

Сортировка слиянием (англ. merge sort) — алгоритм сортировки, который упорядочивает списки (или другие структуры данных, доступ к элементам которых можно получать только последовательно) в определённом порядке.

Для решения задачи сортировки эти три этапа выглядят так:

  1. Сортируемый массив разбивается на две части примерно одинакового размера;

  2. Каждая из получившихся частей сортируется отдельно, например — тем же самым алгоритмом;

  3. Два упорядоченных массива половинного размера соединяются в один.

1.1. — 2.1. Рекурсивное разбиение задачи на меньшие происходит до тех пор, пока размер массива не достигнет единицы (любой массив длины 1 можно считать упорядоченным).

3.1. Соединение двух упорядоченных массивов в один. Основную идею слияния двух отсортированных массивов можно объяснить на следующем примере. Пусть мы имеем два уже отсортированных по неубыванию подмассива. Тогда: 3.2. Слияние двух подмассивов в третий результирующий массив. На каждом шаге мы берём меньший из двух первых элементов подмассивов и записываем его в результирующий массив. Счётчики номеров элементов результирующего массива и подмассива, из которого был взят элемент, увеличиваем на 1. 3.3. «Прицепление» остатка. Когда один из подмассивов закончился, мы добавляем все оставшиеся элементы второго подмассива в результирующий массив.

Реализация на С++ (сортировка по возрастанию):

const int nmax = 1000;

void Merge(int* arr, int begin, int end)

{

int i = begin, t = 0, mid = begin + (end - begin) / 2, j = mid + 1, d[nmax];

while (i <= mid && j <= end) {

//запись в массив d

if (arr[i] <= arr[j]) {

d[t] = arr[i]; i++;

}

else {

d[t] = arr[j]; j++;

}

t++;

}

//перенос оставшихся элементов в массив d

while (i <= mid) {

d[t] = arr[i]; i++; t++;

}

//перенос оставшихся элементов в массив d

while (j <= end) {

d[t] = arr[j]; j++; t++;

}

//перенос элементов обратно в массив arr

for (i = 0; i < t; i++)

arr[begin + i] = d[i];

}

void MergeSort(int *arr, int left, int right)

{

int temp;

if (left<right)

//Если осталось 2 элемента сравниваем их и если необходимо меняем местами

if (right - left == 1) {

if (arr[right]<arr[left]) {

temp = arr[left];

arr[left] = arr[right];

arr[right] = temp;

}

}

else {

MergeSort(arr, left, left + (right - left) / 2);

MergeSort(arr, left + (right - left) / 2 + 1, right);

Merge(arr, left, right);

}

}