Поліпшений алгоритм сортування обмінами
У програмі 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) у гіршому випадку.
Сортування вибором
Основна дія сортування вибором - пошук найменшого елемента в частині масиву, що переглядається, і перестановка з першим елементом цієї частини:
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;
