Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгор_ТХТК_пособие.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.6 Mб
Скачать

X : Array [1..Nmax] Of Real;

A : Real;

n, k, i : Integer;

Begin

Writeln('Введите количество чисел');

Readln(n);

Writeln('Введите массив чисел');

For i := 1 To n Do

Read (X[i]);

For k := 1 To n-1 Do{ Сортировка }

For i := 1 To n-1 Do

If X[i] > X[i+1] Then

Begin

A:=X[i];

X[i]:=X[i+1];

X[i+1]:=A

End;

Writeln('Отсортированный массив чисел:');

For i:=1 To n Do

Write (X[i]);

End.

Глубину просмотра можно уменьшать, основываясь на том, что большие числа "опускаются" вниз (в конец последовательности) и затем не переставляются:

For k := 1 To n-1 Do

For i := 1 To n-k Do

If X[i] > X[i+1] Then

. . . . . . . .

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

Приведем алгоритм для этого метода.

В этом алгоритме используется переменная "Перестановка_есть", которой сначала присваивается значение "истина", а как только в одном из просмотров не будет перестановок – ей присвоится значение "ложь". Это позволит прервать выполнение цикла "Пока".

Program SortUsk;

Const

Nmax = 100;

Var

X : Array [1..Nmax] Of Real;

A : Real;

P : Boolean;

L, K, I, N : Integer;

Begin

Writeln('Введите количество чисел');

Readln(n);

Writeln('Введите массив чисел');

For i := 1 To n Do

Read(X[i]);

P := True; {Перестановка есть}

K := 1; {Номер просмотра}

While P Do

Begin

L:=0; {Кол. перестановок}

For i := 1 To n-k Do

If X[i] > X[i+1] Then

Begin

A := X[i];

X[i]:=X[i+1];

X[i+1]:=A;

L:=L+1

End;

If L=0 Then

P:=False;

k:=k+1;

End;

Writeln('Отсортированный массив чисел');

For i := 1 To n Do

Write(X[i]);

End.

Сортировка выбором

Пусть дан одномерный неупорядоченный массив, содержащий целые числа М={mi}, i=1,n; n - число элементов. Необходимо упорядочить элементы этого массива по возрастанию их значений.

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

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

Пример 5.16 Программа сортировки выбором

Uses crt;

Var

M:array[1..1000] of integer;

n, i, j, Min, i_min:integer;

Begin

Clrscr;

Write(' Введите длину массива n = ');

Readln(n);

{ Вместо ввода с клавиатуры заполним массив случайными числами из диапазона от 0 до 500}

For i:=1 to n do M[i]:=Random(500);

For i:=1 to n-1 do

Begin

{принимаем за минимум i-й элемент}

Min:=M[i]; i_min:=i;

For j:=i+1 to n do

If M[j]<Min then

Begin

{найдено меньшее число - запоминаем его и его адрес}

Min:=M[j]; i_min:=j;

End;

{Обмен}

M[i_min]:=M[i];

M[i]:=Min;

End;

Writeln(' Упорядоченный массив');

For i:=1 to n do write(M[i],' ');

readkey;

End.