
- •Упорядкування вставлянням
- •Упорядкування вибором
- •Упорядкування обміном
- •Порівняння прямих методів упорядкування
- •Бінарний пошук
- •Приклади розв'язування задач
- •Розв’язування.
- •Заповнити тривимірний масив цілих чисел за правилом: елементи на гранях рівні 1, всі інші 0 (за схематичним поданням).
- •Розв’язування.
Порівняння прямих методів упорядкування
Для оцінки швидкодії алгоритмів різних методів упорядкування, як правило, використовують показники:
кількість операцій надання значень;
кількість порівнянь.
Теоретичні й практичні дослідження алгоритмів прямих методів упорядкування показали, що і за кількістю порівнянь, і за кількістю операцій надання значень, вони мають квадратичну залежність від довжини масиву n. Винятком є метод вибору, який має число операцій надання значень порядку n*ln(n). Цю властивість методу вибору доцільно використовувати при упорядкуванні даних складних структур, коли на одне порівняння виконується кілька операцій надання значень.
Якщо порівняти розглянуті методи між собою, то в середньому, методи вставлянням і вибору приблизно еквівалентні і в кілька разів (в залежності від довжини масиву) швидші, ніж метод обміну.
Бінарний пошук
Алгоритм бінарного пошуку використовується для знаходження заданого елемента у впорядкованому масиві. Розглянемо його на прикладі масиву, впорядкованого за зростанням.
Принцип бінарного пошуку:
Якщо середній елемент масиву співпадає з шуканим, то пошук завершено. Якщо ж середній елемент менший шуканого, то елементи ліворуч нього менші шуканого. Їх можна не брати до уваги і продовжити пошук у правій частині масиву. Якщо середній елемент більший шуканого, то слід продовжити пошук у лівій частині масиву.
Так продовжують до тих пір, поки або елемент буде знайдено, або довжина зони пошуку стане рівна нулю. В останньому випадку шуканий елемент не буде знайдено.
Застосуємо алгоритм бінарного пошуку для знаходження числа X = 14 у масиві A.
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
n=16 |
|
||||||||||
1 |
4 |
7 |
11 |
14 |
18 |
20 |
22 |
25 |
29 |
32 |
37 |
41 |
46 |
49 |
53 |
|
||||||||||
L=1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
R=n=16 |
|
||||||||||
|
|
|
|
|
|
|
i:=(L+R) Div 2=8 A[i] > X |
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
R := i – 1=7 |
|
|
|
|
|
|
|
||||||||||||
1 |
2 |
3 |
4 |
5 |
6 |
7 |
|
|
||||||||||||||||||
1 |
4 |
7 |
11 |
14 |
18 |
20 |
|
|
||||||||||||||||||
L=1 |
|
|
|
|
|
R=7 |
|
|||||||||||||||||||
|
|
|
i:=(L+R) Div 2=4 A[i] < X |
|
Програма бінарного пошуку : |
|||||||||||||||||||||
|
|
|
|
|
|
|
|
const MaxN = 20; type TElement = Real; TMas = array[1..MaxN] of TElement; var A : TMas; N, i, j, L, R : Integer; X :TElement; begin Write('Введіть кількість елементів масиву – '); ReadLn(N); for i := 1 to N do begin Write('A[', i, ']='); ReadLn(A[i]); end; WriteLn('Елементи масиву :'); for i := 1 to N do Write(A[i], ' '); WriteLn; L := 1; R := N; repeat i := (L + R) Div 2; if A[i] < X then L := i + 1; if A[i] > X then R := i + 1; until (A[i] = X) Or (L > R); if A[i] = X then WriteLn('Шуканий елемент ', X, ' має номер ', i) else WriteLn('Шуканий елемент ', X, ' у масиві не знайдено'); end. |
||||||||||||||||||
|
|
|
L: = i + 1=5 |
|
|
|||||||||||||||||||||
|
|
|
|
5 |
6 |
7 |
|
|||||||||||||||||||
|
|
|
|
14 |
18 |
20 |
|
|||||||||||||||||||
|
|
|
|
L=5 |
|
R=7 |
|
|||||||||||||||||||
|
|
|
|
i:=(L+R) Div 2=6 A[i] > X |
|
|||||||||||||||||||||
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
R := i–1=5 |
|
||||||||||||||||||||
|
|
|
|
5 |
|
|
|
|||||||||||||||||||
|
|
|
|
14 |
|
|
||||||||||||||||||||
|
|
|
L=R=5 |
|
Отже, шуканий елемент масиву має номер 5.