
- •Лекція №7 Впоряднування одновимірних масивів. Метод ‘’бульбашки’’, вибору, включення, швидке сортування
- •4.5.1. Метод бульбашки.
- •4.5.2. Метод вибору.
- •4.5.3. Сортування за допомогою ознаки (прапорця).
- •4.5.4. Метод прямого включення.
- •4.5.5 Швидке сортування.
- •4.5.6. Розв’язування задач з використанням сортування масиву.
Лекція №7 Впоряднування одновимірних масивів. Метод ‘’бульбашки’’, вибору, включення, швидке сортування
Впорядкування, або сортування масиву - це процес, в результаті якого всі (або частина елементів) будуть впорядковані по зростанню величин елементів або по спаданню їх значень. Впорядкований масив значно легше обробляти, вести в ньому пошук елементів. Всі великі масиви даних, які складають бази даних, обов’язково впорядковують.
Взагалі існує дуже багато алгоритмів впорядкування масивів. Їх можна поділити на декілька основних типів: сортування обміном, швидке та сортування пірамідою. Різниця між ними складається в кількості порівнянь, які необхідно виконати для розв’язку задачі. Для оцінки ефективності алгоритму будемо використовувати дві величини: кількість порівнянь значень елементів(К) та кількість переміщень елементів (S). Останнє значення викликає найбільший інтерес – переміщення даних в пам’яті є більш повільним процесом, ніж порівняння.
Розглянемо декілька алгоритмів одного методу впорядкування - методу обміну. Цей метод дуже легко реалізується, простий для розуміння. Метод обміну полягає в послідовному порівнянні двох вибраних елементів. Якщо порядок слідування елементів порушено, то виконується обмін цих елементів. Зверніть увагу на дію обміну двох елементів - a[i] a[k]. Для цього використовуємо проміжну клітинку пам’яті х.
begin
x:=a[i];
a[i]:=a[k];
a[k]:=x
end;
4.5.1. Метод бульбашки.
Ідея методу бульбашки дуже проста. Попарно порівнюючи елементи, «витискуємо» з масиву найбільш важкий елемент (найбільший) на саме крайнє праве місце, далі наступний елемент і т.д., поки всі елементи не займають свої місця.
var a: array [1..100] of real;
i,j,k,n:integer;
x: real;
begin
writeln('вв.n');
readln(n);
for i:=1 to n do
read (a[i]);
writeln;
for j:=1 to n do {зовнішній цикл, який змушує n раз переглянути масив}
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;
end;
for i:=1 to n do
write(a[i]:5:3);
writeln;
end.
Цей метод має найбільшу кількість порівнянь значень елементів масивів, тому дуже повільний. Для його реалізації треба виконати n2 порівнянь. Якщо n = 100, то це вже 10000 порівнянь. Але частіше обробляються масиви з кількістю елементів n >1000. Інша модифікація методу трохи зменшує кількість порівнянь. В ньому порівнюється кожний елемент з наступними. При цьому кожний наступний крок потребує на одне порівняння менше.
var a: array [1..100] of real;
i,j,k,n:integer;
x: real;
begin
writeln('вв.n');
readln(n);
for i:=1 to n do
read(a[i]);
writeln;
for i:=1 to n-1 do
for k:=i to n do
if a[i]>a[k] then
begin
x:=a[i];
a[i]:=a[k];
a[k]:=x;
end;
for i:=1 to n do
write(a[i]:5:3);
readln;
end.
Виконаємо трасування цієї програми для n=5
значення i |
значення a[i] |
значення k |
значення a[k] |
значення масиву |
1 |
9 |
2 |
7 |
9,7, 4, 2, 6 (проводимо обмін a[i] таa[k]) |
1 |
7 |
3 |
4 |
7, 9,4, 2, 6 (проводимо обмін a[i] таa[k]) |
1 |
4 |
4 |
2 |
4, 9, 7, 2, 6 (проводимо обмін a[i] таa[k]) |
1 |
2 |
5 |
6 |
2, 9, 7, 4,6(не проводимо обмін a[i] таa[k]) |
2 |
9 |
3 |
7 |
2, 9,7, 4, 6 (проводимо обмін a[i] таa[k]) |
2 |
7 |
4 |
4 |
2, 7, 9,4, 6 (проводимо обмін a[i] таa[k]) |
2 |
4 |
5 |
6 |
2, 4, 9, 7,6(не проводимо обмін a[i] таa[k]) |
3 |
9 |
4 |
7 |
2, 4, 9,7, 6 (проводимо обмін a[i] таa[k]) |
3 |
7 |
5 |
6 |
2, 4, 7, 9,6(проводимо обмін a[i] таa[k]) |
4 |
9 |
5 |
7 |
2, 4, 6, 9,7(проводимо обмін a[i] таa[k]) |
|
|
|
|
2, 4, 6, 7, 9 |
Якщо в першому варіанті сортування дляn=5треба було виконати 5*4=20 порівнянь, то в другому варіанті треба виконати 10 порівнянь.