Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4 основи програмування книга.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.77 Mб
Скачать

8.2. Алгоритми пошуку і сортування. Лінійний пошук у масиві

Приклад 8.4. Розглянемо красивий розв’язок задачі пошуку даного елемента в масиві, що використовує цикл While. Насправді, замість використання циклу For з достроковим виходом при допомозі Goto можна застосувати цикл While:

Program WhileSearch;

Const

n = 100;

Type

Vector = array[1..n] of Real;

Var

A : Vector ;

b : Real;

Procedure InpMas(Var V : Vector);

Var i : Integer;

Begin

For i := 1 to n do begin

Write(‘Введіть елемент масива : ‘);

Readln(V[i]);

end;

End;

Procedure InpData(Var b:Real);

Begin

Write(‘Введіть шукане значення : ‘);

Readln(b)

End;

Procedure Found (Var A : Vector; b : Real);

Var i : Integer;

Begin

i := 1;

While (i <= n) and (A[i] <> b) do i := Succ(i);

If i = n + 1

then Writeln(‘Елемент ‘,b,’у масиві відсутній’)

else Writeln(‘елемент ‘,b, розміщений на’,i,’-тому місці’);

End;

Begin

{Блок читання масиву A і елемента b}

InpMas(A);

InpData(b);

Found (A, b);

End.

Недоліком такої реалізації є по-перше, використання складеної умови в циклі, по-друге – можливо некоректне обчислення підвиразів A[i] <> b при i = n +1. Не дивлячись на те, що умова є хибною (i <= n = False), вираз A[n+1] <> b не визначено!

Доповнимо масив A ще одним елементом: A[n+1] = b, і всі недоліки легко ліквідуються!

Program LinearSearch;

Const

n = 101; { Розмір масиву збільшений на 1 }

Type

Vector = array[1..n] of Real;

Var

A : Vector ;

b : Real;

Procedure InpMas(Var V : Vector);

Var i : Integer;

Begin

For i := 1 to n-1 do begin

Write(‘Введіть елемент масива : ‘);

Readln(V[i]);

end;

End;

Procedure InpData(Var b:Real);

Begin

Write(‘Введіть шукане значення : ‘);

Readln(b)

End;

Procedure Found (Var A : Vector; b : Real);

Var i : Integer;

Begin

i := 1;

A[n] := b; { Доповнимо масив “бар’єрним” елементом }

While A[i] <> b do i := Succ(i);

If i = n

then Writeln(‘Елемент ‘,b,’в масиві відсутній’)

else Writeln(‘елемент ‘,b,’розміщений на’,i,’-тому місці’);

End;

Begin

{Блок читання масиву A і елемента b}

InpMas(A);

InpData(b);

Found (A, b);

End.

8.3. Поліпшений алгоритм сортування обмінами

Приклад 8.5. У програмі BublSort цикл For використовується в якості зовнішнього. Це приводить до того, що він виконується рівно n - 1 разів, навіть якщо масив вже упорядкований після декількох перших проходів. Від зайвих проходів можна позбавитися, застосувавши цикл Repeat і перевіряючи у внутрішньому циклі масив на упорядкованість:

Procedure BublSort1 (Var a:Vector);

Var

i, j : Integer;

Temp : Real;

isOrd : Boolean;

Begin

i := n - 1;

Repeat

isOrd := True; { ознака упорядкованості}

For j := 1 to i do

If a[j] > a[j+1]

then begin

Temp := a[j+1];

a[j+1] := a[j];

a[j] := Temp;

isOrd := False { виявлено“засортування” }

end;

i := Pred(i)

until isOrd;

End;

Цей алгоритм можна ще покращити, якщо кожний наступний прохід починати не з початку (j = 1), а з того місця, де на попередньому проході відбувся перший обмін:

{LowIndex : Integer;}

Repeat

isOrd := True; { ознака упорядкованості}

LowIndex := 1; { відрізок A[1..LowIndex] упорядкований}

For j := LowIndex to i do

If a[j] > a[j+1]

then begin

Temp := a[j+1];

a[j+1] := a[j];

a[j] := Temp;

If isOrd then begin

LowIndex := j;

isOrd := False

end

end;

i := Pred(i)

until isOrd;

Відзначимо однак, що наш алгоритм працює не симетрично: якщо найбільший елемент “спливає” на своє місце за один прохід, то найменший елемент “потоне” на 1-е місце, знаходячись початково на n-тому місці, за n-1 прохід. При цьому здійсниться максимально можливе число порівнянь. Усунути асиметрію можна, чергуючи проходи вперед і назад. Реалізацію цієї ідеї, як і подальші поліпшення алгоритму сортування простими обмінами, ми надаємо читачеві в якості вправи.

Всі поліпшення методу, що розглядається відносяться до ефективності в середньому. Жодне з них не зменшує оцінки складності С (n) у гіршому випадку.