1) сортировка вставкой (включением);
2) сортировка выбором (выделением);
3) сортировка обменом (так называемая "пузырьковая" сортировка).
Улучшенные методы сортировки основываются на тех же принципах, что и прямые, но используют некоторые оригинальные идеи для ускорения процесса
Рассмотрим сортировку методом вставки.
Принцип метода заключается в следующем:
Массив разделяется на две части: отсортированную и не отсортированную. элементы из не отсортированной части поочередно выбираются и вставляются в отсортированную часть так, чтобы не нарушить в ней упорядоченность элементов. В начале работы алгоритма в качестве отсортированной части массива принимают только первый элемент, а в качестве не отсортированной – все остальные элементы.
Таким образом, алгоритм будет состоять из (n-1)-го прохода (n – размерность массива), каждый из которых будет включать четыре действия:
• взятие очередного i-го не отсортированного элемента и сохранение его в дополнительной переменной;
• поиск позиции j в отсортированной части массива, в которой присутствие взятого элемента не нарушит упорядоченности элементов;
• сдвиг элементов массива от i-го до j-1-го вправо, чтобы освободить найденную позицию вставки;
• вставка взятого элемента в найденную i-ю позицию.
Для реализации данного метода можно предложить несколько алгоритмов, которые будут отличаться способом поиска позиции вставки.
Рассмотрите процедуру, реализующую выше рассмотренный алгоритм:
Procedure Vstavka(Var a : Array1);
Var
i, j, e,g:integer;
Begin
for i:=2 to c do
begin
e:=A[i];
j:=1;
while (e>a[j]) do
Inc(j);
for g:=i-1 downto j do
a[g+1]:=a[g];
a[j]:=e;
end;
End;
Задание. Составьте программу сортировки одномерного массива рассмотренным методом.
Сортировка выбором
Принцип метода:
Находим (выбираем) в массиве элемент с минимальным значением на интервале от 1-го элемента до n-го (последнего) элемента и меняем его местами с первым элементом. На втором шаге находим элемент с минимальным значением на интервале от 2-го до n-го элемента и меняем его местами со вторым элементом. И так далее для всех элементов до n-1-го.
Рассмотрите схему алгоритма прямого выбора.




Рассмотрите процедуру, реализующую выше рассмотренный алгоритм:
Procedure Vibor(Var a: Array1);
Var
i, j, Min, MinI : integer;
Begin
for i:=1 to c do
begin
Min:=a[i];
MinI:=i;
for j:=i+1 to c do
if a[j]<Min
then
begin
Min:=a[j];
MinI:=j;
end;
a[MinI]:=a[i];
a[i]:=Min;
end;
End;
Задание. Составьте программу сортировки одномерного массива рассмотренным методом.
Занятие 3. Сортировка методом простого обмена. Рекурсивная сортировка
Принцип метода:
Слева направо поочередно сравниваются два соседних элемента, и если их взаимное расположение не соответствует заданному условию упорядоченности, то они меняются местами. Далее берутся два следующих соседних элемента и так далее до конца массива.
После одного такого прохода на последней n-ой позиции массива будет стоять максимальный (или минимальный) элемент ("всплыл" первый "пузырек"). Поскольку максимальный (или минимальный) элемент уже стоит на своей последней позиции, то второй проход обменов выполняется до (n-1)-го элемента. И так далее. Всего требуется (n-1) проход.
Задание. В тетради начертите схему работы рассмотренного алгоритма произвольно выбранного массива.
Рассмотрите процедуру, реализующую выше рассмотренный алгоритм:
Procedure Obmen(Var a : Array1);
Var
i, j,f, g:integer;
Begin
for i:=n downto 2 do
for j:=1 to i-1 do
if a[j]>a[j+1]
then
begin
f:=a[j];
a[j]:=a[j+1];
a[j+1]:=f;
end;
End;
Задание. Составьте программу сортировки одномерного массива рассмотренным методом.
Cортировка массива с помощью рекурсии.
Рассмотрим использование рекурсии для построения алгоритма сортировки значений массива.
Алгоритм реализуется следующим образом: в некотором отрезке массива выбирается центральное (серединное) значение; все элементы из левой части отрезка, превосходящие центральное значение, перемещаются в правую часть, и наоборот. На следующем шаге (для которого используются рекурсивные вызовы этой же процедуры) алгоритм повторяется для обоих частей отрезка.
Рассмотрите процедуру, упорядочивающую по возрастанию значения из массива Massiv в диапазоне индексов Left..Right.
Procedure QuickSort (Left, Right : integer; Massiv : Array1);
Var
i, j, x, y : integer;
Begin
i := Left;
j := Right;
x := Massiv[(Left+Right) div 2];{}
repeat
while Massiv[i]<x do
Inc(i);
while Massiv[j]>x do
Dec(j);
if i<=j
then
begin
y := Massiv[i];
Massiv[i] := Massiv[j];
Massiv[j] := y;
Inc(i);
Dec(j);
end;
until i>j;
if Left<j
then
QuickSort (Left, j);
if i<Right
then
QuickSort (i, Right);
End;
Задача. Составьте программу, реализующую рассмотренный метод. Дополните ее комментариями.
Занятие 4. Сортировка методом слияний.
Определение. Целочисленный массив с расположенными по неубыванию или по невозрастанию значениями элементов называется упорядоченным.
Использование упорядоченности позволяет создавать эффективные алгоритмы для решения многих интересных задач.
Задача слияния двух входных упорядоченных массивов А и В состоит в формировании упорядоченного выходного массива С, содержащего все элементы из входных массивов.
Рассмотрим алгоритм слияния для упорядоченных по неубыванию массивов. Вначале элемент А[1] сравнивается с элементом В[1] и наименьший из них записывается в массив С. Если наименьшим был А[1], то на следующем шаге сравниваются А[2] и B[1], а если наименьшим был B[1], то будут сравниваться A[1] и B[2] и т. д. Если на очередном шаге окажется, что из одного входного массива все элементы переписаны в С, то переписывается элемент из другого массива.
Рассмотрим пример работы алгоритма слияния.
Пусть в массиве А содержатся 3 элемента: {5, 13, 14}, а в массиве В – 4 элемента: {7, 9, 10, 12}. Внимательно рассмотрите таблицу, в которой по шагам показано изменение переменных i, i1, i2 и действия с массивами.
i | i1 | i2 | Сравниваются | C[i] |
1 2 3 4 5 6 7 | 1 2 2 2 2 2 3 | 1 1 2 3 4 5 5 | A[1]=5 и B[1]=7 A[2]=13 и B[1]=7 A[2]=13 и B[2]=9 A[2]=13 и B[3]=10 A[2]=13 и B[4]=12 В весь переписан В весь переписан | 5 7 9 10 12 13 14 |
Рассмотрите фрагмент решения задачи на слияние двух массивов А и В, которые содержат соответственно n1 и n2 элементов. Результирующий массив С будет содержать n1+n2 элементов.
. . .
i1 := 1;
i2 := 1;
for i := 1 to n1+n2 do
if i1>n1
then
begin
C[i] := B[i2];
i2 := i2+1;
end
else
if i2>n2
then
begin
C[i] := A[i1];
i1 := i1+1;
end
else
if A[i1]<=B[i2]
then
begin
C[i] := A[i1];
i1 := i1+1;
end
else
begin
C[i] := B[i2];
i2 := i2+1;
end;
. . .
Задача. Составьте программу, реализующую рассмотренный метод. Дополните ее комментариями.
Для любопытных. Рекурсивная сортировка слиянием
Задача. Напишите программу, содержащую алгоритм слияния в процедуре Sort(A, B, b1, e1, e2). Алгоритм должен копировать со слиянием два упорядоченные куска из массива А с номерами от b1 до e1 и от e1+1 до e2 соответственно в массив В с номерами элементов от b1 до e2.
Предположив, что Вы правильно выполнили предыдущую задачу, алгоритм сортировки можно определить очень просто:
1) если длина сортируемого массива 1, то ничего не делается;
2) в противном случае массив делится на две одинаковые (или почти одинаковые) части, к каждой части применяется алгоритм сортировки, после чего эти упорядоченные части сливаются в один упорядоченный кусок.
Рассмотрите процедуру сортировки слиянием. На вход процедуры сортировки поступает неупорядоченный кусок массива А с номерами элементов от b до e, на выходе – тот же кусок, но упорядоченный. Массив С – вспомогательный.
Procedure Sort2(Var A, C : Array1; b, e : integer);
Var
i, d : integer;
Begin
if b<e
then
begin
d := (b+e) div 2;
Sort2(A, C, b, d);
Sort2(A, C, d+1, e);
Sort(A, C, b, d, e);
for i := b to e do
A[i] := C[i]
end;
End;
Занятие 5-6. Самостоятельное решение задач.
Задание. Выберите с учителем задачи для решения из предложенного ниже перечня.
1. В массиве X(N) каждый элемент равен 0, 1 или 2. Переставить элементы массива так, чтобы сначала располагались все единицы, затем все двойки и, наконец, все нули (дополнительного массива не заводить).
2. В заданной последовательности все элементы, не равные нулю, расположить сохраняя их порядок следования, в начале последовательности, а нулевые элементы - в конце последовательности. Дополнительного массива не заводить.
3. Отсортировать массив по возрастанию, используя процедуру Swap, которая меняет местами 2 элемента.
4. Составьте алгоритм, упорядочивающий элементы массива, стоящие на нечетных местах, в возрастающем порядке, а на четных - в убывающем.
5. Из двух упорядоченных одномерных массивов (длины K и N) сформируйте одномерный массив размером K+N, упорядоченный так же, как исходные массивы.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |


