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

13. Задача сортировки

Сортировка – это расположение чисел в порядке возрастания или убывания.

Наиболее распространенный и простой метод сортировки – метод "пузырька". Он требует минимального объема памяти для данных, но затраты времени на реализацию этого метода велики. Суть метода "пузырька" в следующем.

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

1) числа сравниваются попарно: первое со вторым; второе с третьим; i-тое – с (i+1) - тым;

2) если меньшее стоит в паре на втором месте (числа в паре не упорядочены по возрастанию), то сравниваемые числа меняются местами.

За один такой просмотр массива минимальное число "вытолкнется", по крайней мере, на одно место вверх (вперед), а максимальное – переместится в самый конец (вниз), т.е. минимальное число как легкий пузырек воздуха в жидкости постепенно "всплывает" в начало последовательности. Отсюда – название метода. За n-1 просмотр произойдет полное упорядочение массива при любом исходном расположении чисел в нем. Рассмотрим работу метода на примере, приведенном на рис. 2.8.

19 13 5 31 1 26 7 Исходный массив

1

Перестановки в

первом просмотре

3 19

5 19

1 31

26 31

7 31

1

После первого просмотра

3 5 19 1 26 731

513

Перестановки во

втором просмотре

1 19

После второго просмотра

7 26

5 13 1 19 7 26 31

Перестановки в

третьем просмотре

После третьего просмотра

1 13

7 19

5 1 13 7 19 26 31

1

Перестановки в четвертом просмотре

После четвертого просмотра

5

7 13

1 5 7 13 19 26 31

В пятом просмотре перестановок нет. Сортировка окончена.

1 5 7 13 19 26 31 Отсортированный массив

Рис. 2.8. Иллюстрация метода сортировки "пузырьком"

Алгоритм сортировки

1. Ввести n чисел.

2. Для номера_просмотра от 1 до n-1 выполнить

2.1. Для номера_числа (i) от 1 до n-1 выполнить

Если число[i] > число[i+1], то поменять их местами.

3. Вывести отсортированную последовательность.

4. Закончить.

Программа для этого алгоритма будет иметь вид

Program Sort;

Const

Nmax = 100;

Var

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

. . . . . . . .

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

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

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

1. Ввести массив.

2. Перестановка_есть = истина.

3. Номер_просмотра = 1.

4. Пока перестановка_есть = истина выполнить

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

5. Вывести результат.

6. Закончить.

Уточним отдельные пункты этого алгоритма.

1. Ввести массив.

2. Перестановка_есть = истина

3. Номер_просмотра (к)=1

4. Пока перестановка_есть = истина выполнить

4.1. Количество_перестановок = 0

4.2. Для i от 1 до n-k выполнить

Если x[i] > x[i+1], то

4.2.1. поменять x[i] и x[i+1]

4.2.2. количество_перестановок = количество_перестановок + 1

4.3. Если количество_перестановок = 0, то

перестановка_есть =ложь.

4.4. к=к+1

5. Для i от 1 до n выполнить

Вывести x[i].

6. Закончить.

Программа для этого алгоритма будет иметь вид

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.