Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тема 6(теорія).doc
Скачиваний:
3
Добавлен:
13.07.2019
Размер:
324.1 Кб
Скачать

Швидке упорядкування

Метод швидкого упорядкування елементів масиву розроблено в 1962 році професором Оксфордського університету К. Хоаром.

Принцип методу:

1. Визначити середній елемент масиву A і зберегти його в змінній B. Здійснити перегляд елементів масиву зліва направо у пошуках елементу, який задовольняє умову A[i]  B. Здійснити перегляд елементів масиву справа наліво у пошуках елементу, який задовольняє умову A[j]  B. Знайдені елементи міняємо місцями. Продовжуємо процес до тих пір, поки індекси i, j елементів масиву задовольняють умову ij.

Після цього перший етап закінчено. Елементи масиву поділено на дві частини відносно значення B: всі елементи, які менші або рівні B, розміщуються ліворуч елемента з індексом j+1, а всі елементи, які більші або рівні B, розміщуються праворуч елемента з індексом i-1. Отже, відносно значення B масив упорядковано, але ліва і права його частини ще не упорядковано.

B  

n=10

A

1

2

3

4

5

6

7

8

9

10

L=1

9

4

12

1

7

6

8

4

2

10

R=n

i  9

2  j

 12

4 

 7

6 

j=5

i=6

1

2

3

4

5

6

7

8

9

10

2

4

4

1

6

7

8

12

9

10

B

B

2. На другому етапі повторюються дії першого етапу окремо для лівої і правої частин масиву. У результаті масив буде поділено на чотири частини, кожну з яких можна упорядковувати окремо. Процес продовжується до тих пір, поки довжина частин масиву не стане рівною одному елементу і, отже, всі елементи масиву будуть упорядковані.

Оскільки на кожному етапі повторюються однакові дії, але в різних частинах масиву, то їх зручно оформити у вигляді рекурсивної процедури. Програму, в якій використовується рекурсивна процедура для швидкого упорядкування масиву подано нижче.

const MaxN = 50;

type TCount = 1..MaxN;

TElement = Integer;

TMas = record Mas : array[1..MaxN] of TElement;

Count : TCount;

end;

var M : TMas;

{процедура для введення елементів масиву}

procedure ReadMas(var A : TMas);

var i : TCount;

begin with A do

begin Write('Введіть кількість елементів масиву: ');

ReadLn(Count);

WriteLn('Введіть елементи масиву: ');

for i := 1 to Count do

begin Write('Mas[', i, ']=');

ReadLn(Mas[i]);

end;

end;

end;

{процедура для виведення елементів масиву порядково}

procedure WriteMas(A : TMas);

var i : TCount;

begin WriteLn('Елементи масиву:');

with A do for i := 1 to Count do Write(Mas[i],' '); WriteLn;

end;

{процедура для швидкого упорядкування масиву}

procedure SortMas(var A : TMas; L, R : TCount);

var B, Tmp : TElement; i, j : TCount;

begin with A do

begin B := Mas[(L+R) div 2];

i := L; j :=R;

while i<=j do

begin while Mas[i] < B do Inc(i);

while Mas[j] > B do Dec(j);

if i<=j then

begin Tmp := Mas[i];

Mas[i] := Mas[j];

Mas[j] := Tmp;

Inc(i);

Dec(j);

end;

end;

end;

if L < j then SortMas(A, L , j);

if i < R then SortMas(A, i , R);

end;

begin

ReadMas(M);

SortMas(M, 1, M.Count);

WriteMas(M);

end.

Механізм роботи рекурсивної процедури продемонстровано на схемі:

SortMas(M, 1, M.Count)

Перший рівень рекурсії

Заданий масив

M

1

2

3

4

5

6

7

8

9

10

L=1

9

4

12

1

7

6

8

4

2

10

R=n

B=7

SortMas(M, 1, 5)

SortMas(M, 6, 10)

Другий рівень рекурсії

1

2

3

4

5

6

7

8

9

10

L=1

2

4

4

1

6

R=5

L=6

7

8

12

9

10

R=10

B=4

B=12

j=2

i=4

j=9

i=10

i=R

SortMas(M,1,2)

SortMas(M, 4, 5)

SortMas(M, 6, 9)

Виклик

не виконується

Третій рівень

рекурсії

1

2

4

5

6

7

8

9

L=1

2

1

R=2

L=4

4

6

R=5

L=6

7

8

10

9

R=9

B=2

B=4

B=8

j=1

i=2

j=3

i=5

j=6

i=8

L=j

i=R

L>j

i=R

L=j

Виклик

не виконується

Рекурсивне

повернення

Виклик

не виконується

Рекурсивне

повернення

Виклик

не виконується

SortMas(M, 8, 9) 

Четвертий рівень рекурсії

8

9

L=8

10

9

R=9

j=8

i=9

L=j

i=R

Виклик

не виконується

Рекурсивне

повернення