Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
30
Добавлен:
07.02.2016
Размер:
150.02 Кб
Скачать

4.5.4. Метод прямого включення.

Алгоритм методу наступний – беремо елементи, що стоять васиві та ставимо їх на законне місце. Починаючи з другого елементу перебираємо всі елементи масиву та послідовно порівнюємо з елементами, які мають індекс менше заданого. Якщо елемент, який розглядається менше попереднього, то міняємо їх місцями та продовжуємо порівнювати далі. Якщо вибраний елемент більше попереднього, то він знаходиться на потрібному місці, тому переходимо до включення наступного елементу. Для того, щоб при порявнянні не переходити лівої межі масиву, в якості бар’єру добавляємо в початок масиву ще один елемент (наприклад, A[0]), в який будемо заносити вибраний для сортування елемент.

var a: array [0..100] of real;

i,l,k,n:integer; m, x: integer;

begin

writeln('вв.n');

readln(n);

for i:=1 to n do

read(a[i]);

writeln;

for i:=2 to n do

begin

x:=A[i]; A[0]:=x; {бар’єр}

m:=i;

while x<A[m-1] do

begin

A[m]:=A[m-1]; m:=m-1;

end;

A[m]:=x;

end;

for i:=1 to n do

write(a[i]:5:3);

readln;

end.

Трасування методу включення:

Значення i

Значення a[i]

Значення m

Значення a[m-1]

Значення x

Значення масиву

9, 7, 4, 2, 6

2

7

2

9

7

9

9

1

9

7

9

9

0

7

7

7,9

3

4

3

9

4

9

2

7

4

9

1

7

4

9

0

4

4

4,7,9

4

2

3

9

2

9

2

7

2

9

1

4

2

9

0

2

2

2,4,7,9

5

6

4

9

6

9

3

7

6

9

2

4

6

2, 4, 6, 7, 9

На відміну від попереднього методу, кількість порівнянь дорівнює 14.

Середня кількість порівнянь та обміну елементів: K=(n^2+n-2)/4, S=(n^2+9n-10)/4. Мінімальні та максимальні значення такі: Kmin=n-1, Smin=3*(n-1), Kmax=(n^2+n-4)/4, Smax=(n^2+3n-4)/2.

4.5.5 Швидке сортування.

Швидке сортування основане на порівнянні та обміну не сусідніх елементів, а таких, які розташовані далеко один від одного. Кількість порівнянь в таких алгоритмах становить порядком O(n*ln(n)).

В алгоритмі Шелла масив переглядається зліва направо. Кожний елемент порівнюються з елементом, який розташовано всередині масиву. Зліва елемент повинен бути менше середнього. Якщо порядок порушено, то відбувається перегляд елементів справа за тим же правилом. Далі треба поміняти елементи місцями та знову викликати алгоритм для відрізку масиву зліва від точки зупинки, а далі справа. Таким чином отримуємо рекурсивний алгоритм, який приведено далі.

var a:array [1..100] of integer;

z,n:word;

procedure qsort (l,r:word);

var b,i,j:word;

x:integer;

begin

b:=a[(l+r) div 2];

i:=l; j:=r;

while i<=j do

begin

while a[i]<b do i:=i+1;

while a[j]>b do j:=j-1;

if i<=j then begin

x:=a[i]; a[i]:=a[j]; a[j]:=x;

i:=i+1; j:=j-1;

end;

end;

if l<j then qsort(l,j);

if i<r then qsort(i,r);

end;

begin

writeln('vv.n');

readln(n);

for z:=1 to n do read(a[z]);

writeln;

qsort(1,n);

for z:=1 to n do write(a[z]);

end.

Професор Ч.Хоар подав наступний алгоритм швидкого сортування. Порівняння в цьому алгоритму відбувається не з середнім алгоритмом, а з деякою точкою масиву, роль якої грає елемент з індексом i. Елементи з індексами j розташовані з іншого боку масиву, і вони порівнюються з a[i]. Якщо порушено порядок, то відбувається обмін елементами та обмін індексів iта j.Індекс j весь час зрушується в напрям до індексу i. Далі іде рекурсивний виклик цього алгоритму.

Соседние файлы в папке конспект лекцій 1 паск