Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК_ОАиП.doc
Скачиваний:
47
Добавлен:
01.04.2025
Размер:
5.06 Mб
Скачать

Тема 6.3. Методы сортировки массивов.

Цель: рассмотреть различные способы сортировки, сравнить эффективность разных методов сортировки.

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

рассчитаны на сортировку одномерных массивов. При необходимости двумерный массив можно представить одномерным путем пересчета индексов. Будем рассматривать упорядочение исходного массива А[ 1 ], А[ 2 ], …, А[ n ] по возрастанию. Переход к сортировке по убыванию не представляет труда.

Простой выбор

Найдем в массиве минимальный элемент и поменяем его местами с первым элементом. Те же действия выполним с оставшимися (без первого) n–1 элементами массива, затем с n–2 элементами и так далее, до тех пор, пока не останется один последний элемент, он и будет наибольшим элементом.

Для получения результата необходимо n–1 раз находить минимальное значение в массиве, размер которого уменьшается. Первый раз ищем минимум среди элементов А[1], А[2], …, А[ n ], во второй раз ищем минимум среди элементов А[2], …, А[ n ], в i-тый раз среди А[ i ], …, А[n]. После нахождения минимального элемента, значение которого будем хранить в переменной x, его нужно поменять местами с определенным элементом массива. Необходимо запоминать номер минимального элемента в переменной k.

C onst n=20;

Type mass=array[1 . . n] of real;

procedure Select(var A:mass; n: integer);

var i, j, k: integer; x: real;

begin

for i:= 1 to n–1 do

begin

x:= А[ i ]; k:= i;

for j:= i+1 to n do

if А[ j ]<x then begin x:= А[ j ]; k:=j;

end;

А[ k ]:= А[ i ]; А[ i ]:=x;

End;

End;

Простой обмен

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

C onst n=20;

Type mass=array[1 . . n] of real;

procedure Exchange(var A:mass; n: integer);

Label 1;

var i, j, k: integer; x: real;

begin for i:=2 to n do

begin k:=0;

for j:= n downto i do

if A[ j–1]>A[ j ] then

begin k:=j; X:=A[ j–1];

A[j–1]:=A[ j ]; A[ j ]:=x

end;

if k=0 then goto 1

1: end;

A[k]:= A[ i ]; A[ i ]:=x;

end;

end;

Метод простых вставок

Пусть в заданной последовательности А[1], А[2],…,А[ n ] первые i–1 элементов уже упорядочены и ищется место для i-го элемента. Будем сравнивать А1 элемент по порядку со всеми элементами, стоящими левее, до тех пор, пока не окажется, что некоторый A[ k ] ≤ A[ i ]. Затем сдвинем часть последовательности A[k+1], …, A[j–1] на один элемент вправо и освободим место A[k+1] для элемента A[ i ], куда его и поставим. После того, как мы проделаем подобные действия для всех элементов со второго по n-ный, получим отсортированную последовательность.

C onst n=20;

Type mass=array[1 . . n] of real;

procedure Insert(var A:mass; n: integer);

Label 1;

var i, j, k: integer; x: real;

begin for i:=1 to n do

begin x:=A[ i ]; j:=i–1; k:=1;

while j> 0 do

if A[ i ] ≥ A[ j ] then

begin k:=j+1; j:=0 end

else j:=j–1;

if k=i then goto 1;

for j:=1 downto k+1 do

A[ j ]:= A[ j–1 ];

A[ k ]:=x;

1: end;

end;