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

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

Сортировка – упорядочивание элементов списка, последовательности или массива в соответствии с каким-либо признаком. Если упорядочивается числовая последовательность, то ее можно отсортировать по возрастанию или убыванию, если символьная – то в прямом или обратном алфавитном порядке.

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

– сортировка методом пузырька;

– сортировка методом поиска минимума (максимума);

– сортировка вставками.

Наиболее простой является сортировка методом пузырька.

Сортировка методом пузырька.

Алгоритм состоит в повторяющихся проходах по сортируемому массиву. За каждый проход элементы последовательно сравниваются попарно и, если порядок в паре неверный, выполняется обмен элементов. Проходы по массиву повторяются до тех пор, пока на очередном проходе не окажется, что обмены больше не нужны, что означает – массив отсортирован. При проходе алгоритма, элемент, стоящий не на своём месте, «всплывает» до нужной позиции как пузырёк в воде, отсюда и название алгоритма.

В качестве примера рассмотрим сортировку по возрастанию массива из 10 целых чисел. Массив формируется датчиком случайных чисел, генерирующим значения от 0 до 9.

var

i, j, n, t: integer;

a: array [1..10] of integer;

begin

{Инициализация датчика случайных чисел}

randomize;

n := 10;

{Заполнение массива и вывод его на экран}

for i := 1 to n do

a[i] := Random(10);

WriteLn('Исходный массив');

for i:=1 to n do

Write(a[i],' ');

WriteLn;

{Сортировка массива методом пузырька}

for i:=1 to n-1 do

for j:=1 to n-i do

if a[j]>a[j+1] then

begin

t:=a[j];

a[j]:=a[j+1];

a[j+1]:=t;

end;

{Вывод на экран отсортированного массива}

WriteLn('Отсортированный массив');

for i:=1 to n do

Write(a[i],' ');

WriteLn;

ReadLn;

end.

Сортировка методом поиска минимума (максимума).

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

Основная идея алгоритма следующая: на i-м шаге итерации среди элементов массива a[i]…a[n] ищется минимальный (максимальный) элемент массива и меняется местами с a[i]. На следующем шаге i увеличивается на единицу и процедура поиска повторяется. Всего надо сделать n-1 итераций, где n – число элементов массива.

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

var

i, j, n, t, min: integer;

a: array [1..10] of integer;

begin

{Инициализация датчика случайных чисел}

randomize;

n := 10;

{Заполнение массива и вывод его на экран}

for i:=1 to n do

a[i]:=Random(10);

WriteLn('Ishodnyi massiv');

for i:=1 to n do

Write(a[i],' ');

WriteLn;

{Сортировка массива методом поиска минимума}

for i:=1 to n-1 do

begin

min:=a[i];

for j:=i+1 to n do

if min>a[j] then

begin

min:=a[j];

t:=a[j];

a[j]:=a[i];

a[i]:=t;

end;

end;

{Вывод на экран отсортированного массива}

WriteLn('Otsortirovannyi massiv');

for i:=1 to n do

Write(a[i],' ');

WriteLn;

ReadLn;

end.

Сортировка методом вставки.

В данном алгоритме используется методика «вставки» очередного элемента массива в уже отсортированную часть массива в нужную позицию.

Основная идея следующая: на i-ом этапе итерации производится вставка j-того элемента массива в нужную позицию среди элементов a[1], a[2],. . ., a[j-1], которые уже упорядочены (j = i - 1). После этой вставки первые j элементов массива a будут упорядочены.

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

var

i,j,n, key: integer;

a: array [1..10] of integer;

begin

{Инициализация датчика случайных чисел}

randomize;

n:=10;

{Заполнение массива и вывод его на экран}

for i := 1 to n do

a[i] := Random(10);

WriteLn('Исходный массив');

for i := 1 to n do

Write(a[i],' ');

WriteLn;

{Сортировка массива методом вставки}

for i := 2 to n do

begin

key:=a[i];

j := i – 1;

while (j >= 1) and (a[j] > key) do

begin

a[j+1] := a[j];

j := j – 1;

a[j+1] := key;

end;

end;

{Вывод на экран отсортированного массива}

WriteLn('Otsortirovannyi massiv');

for i := 1 to n do

Write(a[i],' ');

WriteLn;

ReadLn;

end.