Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка - Лабораторні роботи.doc
Скачиваний:
16
Добавлен:
25.04.2019
Размер:
2.12 Mб
Скачать

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

І Автор цього метода Ч. Хоар назвав його швидким сортуванням, оскільки для біль шості масивів цей метод потребує приблизно (n/6) log n обмінів елементів і п log п порівнянь, тобто набагато менше, ніж будь-який з елементарних методів. Метод функціонує за принципом «розділяй та пануй»: елементи масиву діляться на дві частини, і кожна з них потім сортується окремо. Для цього обирають деякий елемент х, назвемо його розділовим. Мета полягає у розташуванні всіх менших за х елементів зліва від х, а всіх більших за х елементів — справа від х. Поділивши масив, слід повторити процедуру сортування для кожної частини, потім — для частин цих частин і т. д., доки кожна з частин масиву не міститиме лише один елемент. Зауважимо, що у деяких модифікаціях методу Хоара розташування та значення розділового елемента можуть змінюватися під час розподілу елементів. Розглянемо одну з таких модифікацій.

Отже, алгоритм методу Хоара є рекурсивним і для його реалізації було б зручно застосувати рекурсивну процедуру. Параметрами цієї процедури будуть змінні left та right, що позначатимуть ліву та праву межу розглядуваної частини масиву. Розділовим елементом вважатимемо середній за номером елемент частини масиву і присвоїмо значення цього елемента змінній х. Рекурсивний виклик процедури для поділу лівого підмасиву на дві частини здійснюється в тому разі, як­що ліва межа підмасиву менша за індекс його середнього елемента, а для поділу правого підмасиву — якщо права межа більша за індекс середнього елемента. Для поділу елементів на дві частини застосовуємо два цикли while у середині циклу repeat-until. На кожній ітерації зовнішнього циклу здійснюватиметься один об­мін елементами між лівою та правою частинами. Внутрішні цикли (здійснюють перегляд масиву зліва та справа) призначені для знаходження чергової пари еле­ментів, що мають бути переставлені. Зазначимо, що переставленим може бути і сам розділовий елемент, при цьому він може втратити властивість розділовості. Цей факт не впливає на коректність роботи розглянутої далі програми.

Приклад 4

program ex6_4; {швидке сортування - метод Хоара}

uses crt;

var i.n:integer; {кількість елементів масиву та іх індекси}

а:аrrау[1..10] of integer; {вихідний масив}

procedure quicksort(left.right:integer);

var i.j,k.x.tmp:integer; {розділовий елемент та допоміжні змінні}

begin

i:=left; {ліва границя підмасиву }

j:=right; {права границя підмасиву }

x:=a[(left+right) div 2]; {значення бар'єрного елемента}

writeln('left=',left,' right=',right,' x=',x);

repeat {розділити масив на підмасиви}

while a[i]<x do i:=i+l; {визначити індекси елементів.}

while a[j]>x do j:=j-l; {що обмінюються }

if i<=j then

begin {обміняти елементи місцями }

tmp:=a[i];

a[i]i-a[j];

a[j]:=tmp;

i:=i+l;

j:=j-l;

{виведення проміжних результатів}

for k:=l to n do

write(a[k],' ');

writeln;

end;

until i>j;

if left<j then

quicksort(left,j); {впорядкувати лівий підмасив} if i<right then

quicksorts, right); {впорядкувати правий підмасив} end:

begin

clrscr;

randomize;{ініціалізація генератора псевдовипадкових чисел}

writeln(‘quick sort’);

writeln(‘enter number of the components (<=10)’);

readln(n);

for i;=l to n do {згенерувати масив }

a[i]:=random(30);

writeln('generated array');

for i:=l to n do {вивести згенерований масив }

write(a[i],' ');

writeln;

writeln(‘sort process’);

quicksort(l,n);

writeln('sorted array');

for i:=l to n do {вивести відсортований масив}

write(a[i].' ');

writeln;

readln;

end.