- •Лекція №7 Впоряднування одновимірних масивів. Метод ‘’бульбашки’’, вибору, включення, швидке сортування
- •4.5.1. Метод бульбашки.
- •4.5.2. Метод вибору.
- •4.5.3. Сортування за допомогою ознаки (прапорця).
- •4.5.4. Метод прямого включення.
- •4.5.5 Швидке сортування.
- •4.5.6. Розв’язування задач з використанням сортування масиву.
4.5.2. Метод вибору.
В цьому методі вибирається, наприклад, мінімальний елемент, та ставиться на своє місце в масиві. Далі з тих елементів, що залишились, теж вибирається мінімальний елемент і т.д.
var a: array [1..100] of real;
i,l,k,n:integer;
min: real;
begin
writeln('вв.n');
readln(n);
for i:=1 to n do
read(a[i]);
writeln;
for i:=1 to n-1 do
begin
min:=a[i]; l:=i;
for k:=i to n do
if a[k]<min then
begin
min:=a[k];
l:=k;
end;
a[l]:=a[i];
a[i]:=min;
end;
for i:=1 to n do
write(a[i]:5:3);
readln;
end.
Трасування цього методу:
значення i |
значення a[i] |
значення k |
значення min |
значення L |
значення масиву |
1 |
9 |
1 |
9 |
1 |
9, 7, 4, 2, 6 |
1 |
9 |
2 |
9 |
2 |
9, 7, 4, 2, 6 |
1 |
9 |
3 |
4 |
3 |
9, 7, 4, 2, 6 |
1 |
9 |
4 |
2 |
4 |
9, 7, 4, 2, 6 |
1 |
9 |
5 |
2 |
4 |
9, 7, 4, 2, 6 |
1 |
|
|
|
4 |
2, 7, 4, 9, 6 |
2 |
7 |
2 |
7 |
2 |
2, 7, 4, 9, 6 |
2 |
7 |
3 |
4 |
3 |
2, 7, 4, 9, 6 |
2 |
7 |
4 |
4 |
3 |
2, 7, 4, 9, 6 |
2 |
7 |
5 |
4 |
3 |
2, 7, 4, 9, 6 |
2 |
|
|
|
3 |
2, 4, 7, 9, 6 |
3 |
7 |
3 |
7 |
3 |
2, 4, 7, 9, 6 |
3 |
7 |
4 |
7 |
3 |
2, 4, 7, 9, 6 |
3 |
7 |
5 |
6 |
5 |
2, 4, 7, 9, 6 |
3 |
|
|
|
5 |
2, 4, 6, 9, 7 |
4 |
9 |
4 |
9 |
4 |
2, 4, 6, 9, 7 |
4 |
9 |
|
|
5 |
2, 4, 6, 9, 7 |
4 |
|
|
|
|
2, 4, 6, 7, 9 |
Кількість порівнянь в останньому методі не менше, ніж у попередньому, але операцій обміну набагато менше, а це є найповільніша операція в ЕОМ. Взагалі, кількість порівнянь елементів - K=(n2-n)/2. Для обміну елементів приведемо мінімальне (елементи впорядковані) та максимальне (елементи розташовані в оберненому порядку) значення:
Smin=3*(n-1), Smax=n2/4+3*(n-1).
4.5.3. Сортування за допомогою ознаки (прапорця).
В цьому алгоритмі значення ознаки змінюється на обернене, якщо відбувся обмін елементами. Якщо обміну не відбулося, це означає, що масив вже впорядкований, і можна закінчувати сортування.
var a: array [1..100] of real;
i,n:integer;
f: boolean; {прапорець}
begin
writeln('вв.n');
readln(n);
for i:=1 to n do
read(a[i]);
writeln;
repeat
f:=false;
for i:=1 to n-1 do
if A[i]>A[i+1] then
begin
x:=A[i]; A[i]:=A[i+1];
A[i+1]:=x; f:= true;
end;
until f=false;
for i:=1 to n do
write(a[i]:5:3);
readln;
end.
Для цього алгоритму кількість порівнянь залежить від виду масиву. Мінімальна кількість порівнянь буде дорівнювати n-1, якщо масив впорядкований. Так, наприклад, при наступних значеннях масиву кількість порівнянь дорівнює 4.
значення i |
значення a[i] |
значення a[i+1] |
значення f |
значення масиву |
1 |
3 |
6 |
false |
3, 6, 8, 12, 15 |
2 |
6 |
8 |
false |
3, 6, 8, 12, 15 |
3 |
8 |
12 |
false |
3, 6, 8, 12, 15 |
4 |
12 |
15 |
false |
3, 6, 8, 12, 15 |
В найгіршому випадку виконується 20 порівнянь.
значення i |
значення a[i] |
значення a[i+1] |
значення f |
значення масиву |
1 |
9 |
7 |
false |
9, 7, 4, 2, 6 |
2 |
9 |
4 |
true |
7, 9, 4, 2, 6 |
3 |
9 |
2 |
true |
7, 4, 9, 2, 6 |
4 |
9 |
6 |
true |
7, 4, 2, 9, 6 |
|
|
|
true |
7, 4, 2, 6, 9 |
1 |
7 |
4 |
false |
7, 4, 2, 6, 9 |
2 |
7 |
2 |
true |
4, 7, 2, 6, 9 |
3 |
7 |
6 |
true |
4, 2, 7, 6, 9 |
4 |
7 |
|
true |
4, 2, 6, 7, 9 |
|
|
|
true |
4, 2, 6, 7, 9 |
1 |
4 |
2 |
false |
4, 2, 6, 7, 9 |
2 |
4 |
6 |
true |
2, 4, 6, 7, 9 |
3 |
6 |
7 |
true |
2, 4, 6, 7, 9 |
4 |
7 |
9 |
true |
2,4, 6, 7, 9 |
|
|
|
true |
2, 4, 6, 7, 9 |
1 |
2 |
4 |
false |
2, 4, 6, 7, 9 |
2 |
4 |
6 |
false |
2, 4, 6, 7, 9 |
3 |
6 |
7 |
false |
2, 4, 6, 7, 9 |
4 |
7 |
9 |
false |
2, 4, 6, 7, 9 |
|
|
|
|
2, 4, 6, 7, 9 |