Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб раб_05.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
69.09 Кб
Скачать
    1. Поліпшений алгоритм сортування обмінами

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

Для такої перевірки введемо проміжну перемінну логічного типу isOrd. Початкове значення цієї змінної дорівнює isOrd=True. Якщо в масиві виконалася перестановка елементів, значення логічної змінної isOrd дорівнює False. Якщо був зроблений перегляд масиву, і не виконалося жодної перестановки елементів масиву, значення логічної змінної isOrd залишається рівним True. Це означає, що масив вже упорядкований, і цикл завершує свою роботу.

Текст програми мовою Паскаль:

Program BublSort1;

Const

n = 100;

Var

a : array[1..n] of Data;

I, j : Integer;

TempMem : Data;

IsOrd : Boolean;

Begin

i := n - 1;

Repeat

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

For j := 1 to i do

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

Then begin

TempMem := a[j+1];

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

a[j] := TempMem;

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

end;

i := i-1

Until isOrd;

End.

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

{LowIndex : Integer;}

LowIndex := 1;

Repeat

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

For j := LowIndex to i do

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

then begin

TempMem := a[j+1];

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

a[j] := TempMem;

If isOrd

then begin

LowIndex := j

isOrd := False

end

end;

If LowIndex > 1 then

LowIndex := Pred(LowIndex)

Until isOrd;

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

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

    1. Сортування вибором

Основна дія сортування вибором - пошук найменшого елемента в частині масиву, що переглядається, і перестановка з першим елементом цієї частини:

For i := 1 to n - 1 do

begin

k := Індекс( Min(a[і], ..., a[n]));

Переставити a[і], a[k]

end;

Розв'язування.

Алгоритм сортування вибором здійснює n-1 лінійний перегляд масиву A. У результаті кожного перегляду найменший елемент переглянутої частини масиву міняється місцями з першим елементом цієї частини. Перший перегляд здійснюється у всьому масиві, а кожен наступний – у діапазоні, на одиницю меншому. Таким чином, ліва частина масиву поступово стає упорядкованою. На рисунку 5.2. ці елементи – від a[1] до a[і] - заштриховані білим кольором. На рисунку виділені елементи, що переставляються, a[і+1] і a[MinInd].

Рис 5.2. Алгоритм сортування вибором.

Текст програми мовою Паскаль:

Program SelectSort;

Const

n = 10;

Var

a : array[1..n] of Data;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]