Тема : «Сортировка элементов одномерного массива»
МБОУ «СОШ №2» городского округа Судак
Жолтикова Е.М .
Понятие массива.
Ряд однотипных данных, имеющих имя, порядковый номер и численное значение называются массивами.
Порядковый номер
1 2 3 4 5 6 7 8 9
- 5 14 7 10 32 9 -45 34 16
А
Имя
Значение
Пример: Сформировать одномерный массив из 9 элементов и распечатать его.
Сортировка элементов в массиве
Сортировка представляет собой процесс упорядочения элементов в массиве по возрастанию или убыванию их значений.
Например: Массив Х из n элементов будет отсортирован в порядке возрастания значений его элементов, если
X[1]
И в порядке убывания, если
X[1] = X[2] = … = X [n]
Способы сортировки массива:
Сортировка «пузырька»
Сортировка «перестановкой»
Сортировка «вставкой»
Сортировка «выбором»
Быстрая сортировка
Сортировка массива методом «пузырька»
Сортировка методом пузырька использует метод обменной сортировки и основана на выполнении в цикле операций сравнения и при необходимости обмена соседних элементов.
Принцип сортировки массива по возрастанию методом «пузырька»
- Сравним первый элемент массива со вторым. Если первый окажется больше второго, то поменяем их местами. Те же действия выполним для второго и третьего, третьего и четвёртого, I-го и (I + 1)-го, (n – 1)-го и n-го элементов. В результате этих действий самый большой элемент станет на последнее (n-е) место. Теперь повторим данный алгоритм сначала, но последний (n-й) элемент, рассматривать не будем, так как он уже занял своё место. После проведения данной операции самый большой элемент оставшегося массива встанет на (n - 1) место. Так повторяем до тех пор, пока не упорядочим весь массив.
Сортировка массива А состоящего из 5 элементов, по возрастанию методом «пузырька»
Таблица сортировки массива по возрастанию
Номер элемента
1
Исходный массив
2
7
Первый просмотр
3
3
3
Второй просмотр
Третий просмотр
5
3
4
5
5
4
3
4
4
Четвертый просмотр
2
2
2
2
2
4
7
5
3
7
5
4
7
5
7
Блок-схема сортировки массива методом «пузырька»
j:=1
i:=1
нет
да
a[i]a[i+1]
Pr:=a[i+1]; A[i+1]=a[i];
A[i]:=pr;
j:=j+1
да
нет
j
i:=i+1
нет
да
да
j=n-1
j=j+1
i
нет
Сформировать массив из n элементов и упорядочить элементы в массиве по возрастанию их значений (метод «пузырька»)
Сортировка массива методом «перестановки»
Таблица сортировки массива по убыванию методом «перестановки»
№ элементов
Значения элементов массива
1
перестановки
7
2
9
Первая
3
14
Вторая
4
9
1
14
9
Третья
14
5
1
14
Четвертая
1
7
5
14
9
7
9
5
7
7
1
5
5
5
1
Если n элементов, то количество перестановок n 2
Таблица сортировка массива по возрастанию методом «перестановки»
№ элементов
Значения элементов массива
1
перестановки
7
2
Первая
9
3
1
Вторая
4
1
1
9
Третья
14
5
5
7
1
Четвертая
1
7
5
14
5
5
14
5
7
9
14
7
9
9
14
Если n элементов, то количество перестановок n 2
Блок-схема сортировки массива методом «перестановки»
i:=1
J:=i+1
нет
да
a[i]a[j]
Pr:=a[j]
A[j:]=a[i]
A[i]:=pr
j:=j+1
нет
да
j
i:=i+1
да
i
Сформировать массив А размерностью 10. Задать значения элементов массива с помощью ГСЧ . Расположить элементы массива по возрастанию (метод перестановки).
Сформировать массив А размерностью 10. Задать значения элементов массива с помощью ГСЧ . Расположить элементы массива по убыванию (метод перестановки).
Сортировка массива методом «вставки»
Сначала упорядочиваются два элемента массива.
Затем делается вставка третьего элемента в соответствующее место по отношению к первым двум.
Четвёртый элемент помещают в список из уже упорядоченных трёх элементов.
Этот процесс повторяется до тех пор, пока все элементы не будут упорядочены.
ПРИМЕР : Дан массив из восьми элементов. Первые шесть уже упорядочены, а седьмой нужно вставить между вторым и четвёртым. Сохраним его во вспомогательной переменной Х. Пятый элемент переместим на место шестого, четвёртый – на место пятого, а третий на место четвёртого. То есть выполнили сдвиг элементов массива на одну позицию вправо. Запишем содержимое вспомогательной переменной в третью позицию.
- Y 8
- Y 7
- Y 3
- Y 4
- Y 5
- Y 2
- Y 1
- Y 6
- X
Блок-схема сортировки массива методом «вставки»
Начало
1
Ввод n
i=1,n
Yj+1=Yj
Yi
J=j -1
i=2,n
Yj+1=X
X=Yi
i=1,n
j=i -1
Yj
Конец
J0 and x j
1
Фрагмент программы, реализующей сортировку массива методом вставки.
For i:=1 to n do
Begin
x:=y[i];{Сохраним текущий элемент массива.}
{В переменной j будем хранить номера элементов, предшествующих текущему.}
J:=i-1;
{Сдвиг массива на одну позицию в право до тех пор, пока}
While (x0) do
Begin
y[j+1] :=y[j]:
j:=j-1;
End;
{Запись текущего элемента на соответствующую позицию,}
{то есть перед элементами, превышающими его.}
y[j+1]:=x;
end;
Сортировка массива по возрастанию методом «выбора»
- Найдем в массиве самый большой элемент и поменяем его местами с последним элементом.
- Повторим алгоритм поиска максимального элемента, уменьшив количество просматриваемых элементов на единицу и поменяем его местами с предпоследним элементом.
- Описанную выше операцию поиска проводим до полного упорядочивания элементов в массиве..
Для упорядочивания массива по убыванию необходимо перемещать минимальный элемент.
Блок – схема сортировки массива методом «выбора»
K=n
j=1,n
n=n-1
max=y[1]
nom=1
b=y[nom]
y[nom]=y[n]
y[n]=b
i=2,n
y[i]max
max=y[i]
nom=i
Быстрая сортировка.
Принцип работы
Один из самых быстрых алгоритмов, позволяющих достигать производительности ~ O(n*log n).
1. В исходной последовательности выбирается некоторый опорный элемент a[i].
2. Пробегаемся по всей последовательности и элементы, меньшие, либо равные a[i] располагаем слева от него, большие - справа.
- Эту же самую процедуру рекурсивно запускаем для 2-х полученных половинок. =a[i]
Т.е. в 2-х полученных последовательностях слева и справа от выбранного на первом шаге элемента - также выбираем некоторый опорный ключ и перебрасываем соответствующие большие и меньшие чем он элементы.
4. В уже 4-х полученных последовательностях - тоже самое. Пока не получим последовательности, состоящие лишь из одного элемента. После выполнения всех рекурсий в результате получаем отсортированную исходную последовательность.
Выбор опорного элемента
При быстрой сортировке выбор опорного элемента на каждом шаге играет очень значительную роль, т.к. от этого зависит суммарная скорость выполнения всего алгоритма при различных условиях сортировки.
Варианты выбора опорного элемента.
- Частичная упорядоченность элементов.
- Наиболее хаотичное расположение элементов.
- Самые распространенные варианты:
• выбор середины отрезка
• выбор случайного элемента последовательности
• выбор первого элемента последовательности .
Алгоритм выбора опорного элемента последовательности
Этот алгоритм был впервые описан К. А. Р. Хоаром в его классической статье «Быстрая сортировка»
Чтобы отсортировать массив, мы разделяем его на два под массива и сортируем каждый из них рекурсивно. Например, для сортировки массива из семи элементов:
положение первого обмена
Разделение массива
4
9
7
6
2
3
8
i
j
Исходное положение
4
9
7
6
2
3
8
j
i
4
3
7
6
2
9
8
i
Положение второго обмена
j
4
3
2
6
7
9
8
i
j
Положение третьего обмена
Пример: Сформировать массив из 10 элементов. Значения задать ГСЧ. Отсортировать массив методом «быстрой сортировки».
procedure QuickSort(l, t: integer);
var i: integer;
begin
if l
begin
i:=part(l, t);
QuickSort(l,i-1);
QuickSort(i+1,t);
end;
end;
begin
clrscr;
randomize;
for k:=1 to 10 do
begin
a[k]:=random(100);
write(a[k]:3);
end;
program Quitsort;
uses
crt;
Const
N=10;
Type
Mas=array[1..n] of integer;
var
a: mas;
k: integer;
function Part(l, r: integer):integer;
var
v, i, j, b: integer;
begin
V:=a[r];
I:=l-1;
j:=r;
repeat
repeat
dec(j)
until (a[j]
repeat
inc(i)
until (a[i]=v) or (i=j-1);
b:=a[i];
a[i]:=a[j];
a[j]:=b;
until i=j;
a[j]:=a[i];
a[i]:= a[r];
a[r]:=b;
part:=i;
end;
QuickSort(1,n);
writeln;
for k:=1 to n do
write(a[k]:3);
readln;
end.
Пример: Сформировать массив из 10 элементов. Значения задать ГСЧ. Отсортировать массив методом «быстрой сортировки».
program Quitsort;
uses
crt;
Const
N=10;
Type
Mas=array[1..n] of integer;
var
a: mas;
k: integer;
function Part(l, r: integer):integer;
var
v, i, j, b: integer;
begin
V:=a[r];
I:=l-1;
j:=r;
repeat
repeat
dec(j)
until (a[j]
repeat
inc(i)
until (a[i]=v) or (i=j-1);
b:=a[i];
a[i]:=a[j];
a[j]:=b;
until i=j;
a[j]:=a[i];
a[i]:= a[r];
a[r]:=b;
part:=i;
end;
procedure QuickSort(l, t: integer);
var i: integer;
begin
if l
begin
i:=part(l, t);
QuickSort(l,i-1);
QuickSort(i+1,t);
end;
end;
begin
clrscr;
randomize;
for k:=1 to 10 do
begin a[k]:=random(100);
write(a[k]:3);
end;
QuickSort(1,n);
writeln;
for k:=1 to n do
write(a[k]:3);
readln;
end.
Результат работы программы
60,79, 82, 58, 39, 9, 54, 92, 44, 32
60,79, 82, 58, 39, 9, 54, 92, 44, 32
9,79, 82, 58, 39, 60, 54, 92, 44, 32
9,79, 82, 58, 39, 60, 54, 92, 44, 32
9, 32, 82, 58, 39, 60, 54, 92, 44, 79
9, 32, 44, 58, 39, 60, 54, 92, 82, 79
9, 32, 44, 58, 39, 54, 60, 92, 82, 79
9, 32, 44, 58, 39, 92, 60, 54, 82, 79
9, 32, 44, 58, 39, 54, 60, 79, 82, 92
9, 32, 44, 58, 54, 39, 60, 79, 82, 92
9, 32, 44, 58, 60, 39, 54, 79, 82, 92
9, 32, 44, 58, 54, 39, 60, 79, 82, 92
9, 32, 44, 58, 54, 39, 60, 79, 82, 92
9, 32, 44, 58, 54, 39, 60, 79, 82, 92
9, 32, 39, 58, 54, 44, 60, 79, 82, 92
9, 32, 39, 58, 54, 44, 60, 79, 82, 92
9, 32, 39, 44, 54, 58, 60, 79, 82, 92
9, 32, 39, 44, 58, 54, 60, 79, 82, 92
9, 32, 39, 44, 54, 58, 60, 79, 82, 92
9, 32, 39, 44, 54, 58, 60, 79, 92, 82
9, 32, 39, 44, 54, 58, 60, 79, 82, 92
Заключение
Метод быстрой сортировки позволяет существенно сократить количество операций .
Например: Все предыдущие методы требовали N 2 операций , где N – количество элементов.
Метод быстрой сортировки требует в среднем N*Log 2 N операций .
В случае N=100, выигрыш составляет порядка 100 раз .