Тема Сортировка. Методы внутренней сортировки

Вид материалаДокументы
Подобный материал:
Раздел 3. Алгоритмы, структуры данных и система программирования Паскаль.

Тема 3.8. Сортировка. Методы внутренней сортировки.

  1. Понятие сортировки.
  2. Внутренняя и внешняя сортировки.
  3. Метод сортировки обменами.
  4. Метод сортировки вставками.
  5. Метод сортировки выбором.


Сортировка – это процесс изменения порядка расположения элементов в некоторых упорядоченных структурах данных таким образом, чтобы обеспечить возрастание или убывание числового значения элемента данных или определенного числового параметра, связанного с каждым элементом данных, при переходе от предыдущего элемента к последующему. То есть для любой пары чисел определены отношения "больше" или "меньше". Для переменных символьного типа понятия "возрастание" и "убывание" относятся к значениям машинного кода, используемого для представления символов в памяти компьютера. Так как все буквенные символы располагаются в таблице кодов по алфавиту, то сортировка слов текста всегда приводит к их упорядочению в алфавитной последовательности.

Сортировка данных используется для эффективного решения других задач при программировании. Для упорядоченной совокупности данных быстро и легко решается задача, как поиск и отбор информации по заданному условию.

Существует много алгоритмов, обеспечивающих решение задачи сортировки. Одни из них обладают низким быстродействием, другие обладают очень высокой эффективностью и практически используются в современных компьютерных системах.

Более важным для выбора алгоритма является местоположение данных - в оперативной памяти компьютера или на внешнем устройстве.

Здесь играет роль различие в основных критериях качества - для данных в оперативной памяти основными положительными свойствами метода являются быстродействие и потребности в дополнительной памяти. Для дисковых файлов очень важным показателем является количество обращений к устройству для выполнения операций ввода-вывода - оно должно быть минимальным.

Различают два вида сортировки данных:

- сортировка данных, расположенных в оперативной памяти компьютера (внутренняя сортировка);

- сортировка данных, расположенных на внешних запоминающих устройствах (внешняя сортировка).

Сформулируем постановку задачи сортировки данных для внутренней сортировки одномерного числового массива по возрастанию: имеется одномерный массив чисел, состоящий из n элементов: X[n]. Переставить элементы массива так, чтобы их значения располагались в порядке возрастания. Другими словами, для любой пары элементов X[i] и X[i+1] выполняется неравенство вида: X[i] <= X[i+1].

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

При разработке программы можно воспользоваться различными алгоритмами. Наиболее известными являются следующие:

- метод сортировки обменами ("пузырьковая" сортировка);

- метод сортировки вставками;

- метод сортировки выбором элемента;

Главным показателем качества алгоритма внутренней сортировки является скорость сортировки.

Выбор в пользу того или иного алгоритма может быть сделан при условии тщательного статистического анализа реальной задачи и это является достаточно важной проблемой в программировании.

Метод обмена ("пузырька") один из самых простых методов внутренней сортировки. Суть алгоритма состоит в последовательном просмотре массива от конца к началу или от начала к концу и сравнении каждой пары элементов между собой. При этом "неправильное" расположение элементов устраняется путем их перестановки. Процесс просмотра и сравнения элементов повторяется до просмотра всего массива. При сортировке по возрастанию "легкие" элементы с меньшим значением как бы "всплывают" к началу массива подобно тому, как это делают пузырьки воздуха в стакане с водой - отсюда и происходит популярное название алгоритма.

"Пузырьковая" сортировка имеет очень плохие временные характеристики. Она имеет только учебно-исторический интерес и не может быть рекомендована для практического использования.

Одна из возможных версий процедуры, реализующей алгоритм "пузырька", представлена на языке программирования Pascal. Массив для сортировки X[n] и его размер n считаются глобальными переменными. Тип элементов массива - целый. Сортировка осуществляется по возрастанию.


procedure Puzirek;

var i, j : integer;

y : integer;

begin

for i := 2 to n do

for j := n downto i do

if x[j-1] > x[j] then

begin

y:=x[j-1];

x[j-1]:=x[j];

x[j]:=y

end;

end;


Метод сортировки вставками заключается в переборе всех элементов массива от первого до последнего и вставке каждого очередного элемента на место среди предшествующих ему элементов, упорядоченных ранее таким же способом. Поскольку процесс начинается с самого первого элемента, то последовательность упорядоченных элементов постепенно растет до тех пор, пока самый последний элемент не встанет на "свое" место. Освобождение места для вставки элемента осуществляется путем соответствующего сдвига группы элементов.

Данный алгоритм также обладает слишком низким быстродействием.


procedure Vstavka;

var z, y, i, j : integer;

begin

for i := 2 to n do

for j := 1 to i-1 do

if X[j] > X[i] then

begin

z := x[i];

for y := i downto j+1 do x[y] := x[y-1];

x[j] := z

end

end;


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

По сравнению с алгоритмами вставки и "пузырька" он в большинстве случаев может оказаться более быстрым.

Ниже приводится текст процедуры, реализующей один из возможных вариантов описанного алгоритма.


procedure Vibor;

var r, i, j: Integer;

begin

for i := 1 to n-1 do

begin

r := i;

for j := i+1 to n do

if a[r] > a[j] then r := j;

y:=a[r]; a[r]:=a[i]; a[i]:=y;

end

end;