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

advertisement
Давыдова Е.В., школа № 444
Урок 6 (1 час)
Тема урока. Сортировка массивов
Цель урока. Познакомить учащихся с основными алгоритмами сортировки
одномерных массивов.
План урока.
1. Общие замечания.
2. Сортировка методом выбора.
3. Сортировка методом обмена (метод "пузырька").
Сортировка – процесс размещения элементов заданного множества объектов в
некотором определенном порядке, как правило, в порядке возрастания или
убывания.
Зачем нужна сортировка?
Легче работать с отсортированными данными, чем с произвольно
расположенными данными:
 поиск заданного элемента,
 определение имеются ли пропущенные элементы,
 сравнение двух массивов.
Предварительные замечания.
Общий вид программы сортировки:
Uses Crt;
Const
Type
Var
N = 50;
T_Mas = Array [1..N] of Integer;
Mas : T_Mas;
Kol
: Integer;
Procedure Count (Var Kol_1:Integer);
{Процедура определения размерности массива}
Var
IOR : Word;
Begin
Write('Введите размерность массива: ');
Repeat
{$I-} ReadLn(Kol_1); {$I+}
IOR := IOResult;
If (IOR <> 0) or (Kol_1>N) Then
WriteLn('Ошибка. Повторите ввод.')
Until (Kol_1<=N) and (IOR=0)
End;
Procedure Filling (Kol_1:Integer; Var A: T_Mas);
{Процедура заполнения массива}
Var I : Integer;
Давыдова Е.В., школа № 444
Begin
Randomize;
For I := 1 To Kol_1 Do A[I] := Random(N)
End;
Procedure Print (Kol_1:Integer; A: T_Mas);
{Процедура вывода массива}
Var I : Integer;
Begin
For I:=1 to Kol_1 do Write (A[I], ' ')
End;
Procedure Sort_Metod_ (Kol_1:Integer; Var X: T_Mas);
{Процедура сортировки по методу . . .}
Begin
ClrScr;
Count(Kol);
Filling(Kol, Mas);
WriteLn('Исходный массив'); Print (Kol, Mas);
Sort_Metod_ (Kol, Mas);
WriteLn;
WriteLn('Отсортированный массив'); Print (Kol, Mas);
Repeat until KeyPressed
End.
Пример
5
13
7
9
1
8
16
4
10
2
Давыдова Е.В., школа № 444
Сортировка выбором
Принцип. В неупорядоченной последовательности выбирается минимальный
(максимальный) элемент и записывается на первое место. Этот элемент
исключается из дальнейшей обработки. Оставшаяся последовательность
элементов принимается за исходную. И процесс повторяется до тех пор, пока
все элементы не будут выбраны.
Блок-схема
Н
K=1
MIN=X[K]
I_MIN=K
J=K+1
Нет
X[J]<MIN
I_MIN=J
MIN=X[J]
J=J+1
Нет
J>K
X{MIN}=X[K]
X[K]=MIN
K=K+1
Нет
K > KOL
К
Давыдова Е.В., школа № 444
Программа
Procedure Sort_Metod_Choice (Kol_1:Integer; Var X: T_Mas);
Var K, J, Min, I_Min : Integer;
Begin
For K:=1 to Kol_1 do
begin
Min := X [K]; I_Min := K;
For J := K+1 to Kol_1 do
If X[J] < Min Then
begin Min:= X[J]; I_Min:=J end;
X[I_Min] := X[K]; X[K] :=Min
end
End;
Задание
1. Подсчитать количество произведенных сравнений.
2. Подсчитать количество произведенных перестановок.
3. Изменить процедуру сортировки так, чтобы сортировка начиналась с
последнего элемента массива (с конца, индекс К - уменьшался).
4. Отсортировать четные элементы массива.
Давыдова Е.В., школа № 444
Сортировка обменом (метод "пузырька")
Принцип. Все соседние элементы массива попарно сравниваются друг с другом
и меняются местами в том случае, если предшествующий элемент больше
(меньше) последующего. Затем процесс повторяется. Сортировка
заканчивается, когда перестановок в массиве не будет.
Блок-схема.
H
K=2
Flag=False
Нет
X[K] < X[K-1]
A = X[K-1]
X[K-1] = X[K]
X[K] = A Flag:= True
K = K +1
Нет
K > KOL_1
Да
Flag = False
Kol_1= Kol_1 -1
K
Давыдова Е.В., школа № 444
Программа
Procedure Sort_Metod_Bubble (Kol_1:Integer; Var X: T_Mas);
Var K, A : Integer;
Flag : Boolean;
Begin
Repeat
Flag := False;
For K := 2 to Kol_1 do
If X[K] < X [K-1] Then
begin
A := X[K-1];
X[K-1] := X[K];
X[K] := A;
Flag:= True
end;
Kol_1 := Kol_1 – 1;
Until not Flag
End;
Задание
1. Подсчитать количество произведенных сравнений.
2. Подсчитать количество произведенных перестановок.
3. Сравнить сортировку методами выбора и обмена по количеству сравнений и
перестановок.
4. Описать процедуру "пузырьковой" сортировки по убыванию.
Давыдова Е.В., школа № 444
Урок 7 (1 час)
Тема урока. Сортировка массивов (продолжение).
Цель урока. Познакомить учащихся с основными алгоритмами сортировки
одномерных массивов.
План урока.
1. Сортировка методом прямого включения.
2. Слияние двух массивов.
1. Сортировка методом прямого включения
При сортировке из неупорядоченной последовательности элементов поочередно
выбирается каждый элемент, сравнивается с уже упорядоченными элементами и
помещается на соответствующее место в списке упорядоченных элементов.
место вставки
очередной элемент
1 этап
38
12
80
15
36
23
74
62
2 этап
12
38
80
15
36
23
74
62
3 этап
12
38
80
15
36
23
74
62
4 этап
12
15
38
80
36
23
74
62
5 этап
12
15
36
38
80
23
74
62
6 этап
12
15
23
36
38
80
74
62
7 этап
12
15
23
36
38
74
80
62
12
15
23
36
38
62
74
80
Procedure Sort_Metod_Insert (Kol_1:Integer; Var X: T_Mas);
Var
K, J, A : Integer;
Begin
For K := 2 to Kol_1 do
begin
A := X[K]; J := K-1;
While (J > 0) and (A <= X[J]) do
begin X[J+1] := X[J]; Dec(J) end;
X[J+1] := A
end
End;
Давыдова Е.В., школа № 444
2. Слияние двух массивов
Дан массив X[1..N] и числа K, M, N, такие, что K<=M<=N. Описать процедуру,
которая сливает отрезки массива, X[K+1], . . , X[M] и X[М+1], . . , X[N] в
упорядоченный отрезок массива X[K+1], . . , X[N].
Основная идея решения состоит в сравнении очередных элементов каждой
части, выявления, какой из них меньше, перенос его в массив С, который
является вспомогательным, и продвижении по тому массиву-части, из которого
взят элемент. Когда одна из частей будет пройдена до конца, остается только
перенести в С оставшиеся элементы второй части, сохраняя их порядок.
Procedure Sort_Metod_Merge (K, M, N:Integer; Var X: T_Mas);
Var
I, J, L : Integer;
C
: T_Mas;
Begin
I := K+1; J := M+1; L := 1;
While (I <=M) and (J <=N) Do {Пока не закончится хотя бы одна часть}
begin
If X[I] <= X[J] Then
begin C[L] := X[I]; Inc(I) end
Else
begin C[L] := X[J]; Inc(J) end;
Inc(L)
end; {Один из массивов обработан полностью}
{Перенос в С остатка другого массива-части}
While I <= M Do
begin C[L] := X[I]; Inc(I); Inc(L) end;
While J <= N Do
begin C[L] := X[J]; Inc(J); Inc(L) end;
{Перенос из вспомогательного массива С в массив Х}
For I := 1 to L do X[K+I] := C[I]
End;
Задание
1. Написать программу, в которой массив разбивается на три части. Вторая и
третья часть массива отдельно сортируются, а затем объединяются с помощью
алгоритма слияния.
2. Написать программу, которая сортирует один массив 3-мя способами и
сравнивает их по времени сортировки. Количество элементов массива не менее
500.
Давыдова Е.В., школа № 444
Урок 8 (1 час)
Тема урока. Сортировка массивов (продолжение).
Цель урока. Познакомить учащихся с основными алгоритмами сортировки
одномерных массивов.
План урока.
1. Сортировка с разделением ("быстрая" сортировка, метод Хоара).
2. Рекурсия.
1. Сортировка с разделением ("быстрая" сортировка, метод Хоара)
1. В исходном не отсортированном массиве выбрать некоторый элемент x=a[k]
(барьерный элемент).
2. Переставить элементы массива таким образом, чтобы слева от х оказались
элементы массива, меньше или равные х, а справа – элементы массива, больше
х.
Это можно сделать следующим образом. Используем два "указателя"
– i и j; i ведет отсчет номеров элементов слева, а j – справа.
Сначала имеем i = 1, j = n (в рассматриваемом случае число
элементов массива n=16). Значение основного элемента обозначим
m.
Сравним m и a[j]. Если a[j]>m, то устанавливаем j=j-1 и проводим
следующее сравнение m и a[j]. Продолжаем уменьшение j до тех пор,
пока не достигнем a[j]<=m. Тогда поменяем местами элементы a[j] и
a[i] (строку 5, обмен значений 38 и 4) , установим значение i = i+1 и,
сравнивая элементы a[i] со значением m. После следующего обмена
(строка 10, элементы со значениями 79 и 38) опять уменьшим j, и
будем просматривать элементы справа налево и т.д. до тех пор, пока
не станет j<=i.
Давыдова Е.В., школа № 444
i
1
38
38
38
38
38
4
2
8
3
16
4
6
5
79
6
76
7
57
8
24
9
56
10
2
11
58
12
48
14
70
15
45
45
70
4
38
38
38
38
38
79
8
16
6
79
38
38
38
38
2
48
58
2
38
38
76
76
38
38
38
24
4
13
4
j
16
47
47
8
16
6
2
24
56
57
38
24
38
38
57
38
57
56
76
58
48
79
Главная цель – не разделить исходный массив, а отсортировать его.
Однако, разделив массив, можно сделать то же самое с обеими
полученными частями, а затем с частями частей и т.д., пока каждая
часть будет содержать только один элемент. Соответствующие
действия можно выполнить, используя рекурсию или механизм
стека.
70
45
47
Действия
исходный массив
уменьшение j
4 < 38
обмен
увеличение i
79 > 38
обмен
уменьшение j
2 < 38
обмен
увеличение i
обмен
уменьшение j
24 < 38
обмен
увеличение i
обмен
полученный
массив
Давыдова Е.В., школа № 444
Программа
Вспомогательная процедура, выполняющая разделение массива с
границами L и R на две части.
Procedure Partition (L,R : Integer; Var A : T_Mas);
Var I, J, M, Tmp : Integer;
Begin
If L < R {условие продолжения рекурсии} Then
begin
I := L; J := R;
M := A[I];
Repeat
While M < A[J] Do
{Уменьшение указателя J}
J := J -1;
If I <= J Then
begin {Обмен}
Tmp:= A[I]; A[I] :=
A[J]; A[J] := Tmp;
I := I + 1;
end;
While M > A[I] Do {Увеличение
указателя I}
I := I + 1;
If I <= J Then
begin
{Обмен}
Tmp:= A[I]; A[I] :=
A[J]; A[J] := Tmp;
J := J - 1;
end;
until I > J;
Partition (L, J, A);
{Разделяем левую часть}
Partition (I, R, A);
{Разделяем правую часть}
end
end;
Procedure Sort_Metod_Quick (Kol_1:Integer; Var X: T_Mas);
Begin
Partition (1, Kol_1, X)
End;
Download