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

2.2 Сортування методом «бульбашки»

Припустимо, що для якогось масиву R встановлені наступні закономірності: R[1]< R[2], R[2]< R[3], R[3]< R[4], . . ., R[ n-1]< R[n]. Масив є впорядкованим за зростанням його елементів. Тому можна сформулювати таке правило: якщо кожний елемент масиву менший за безпосередньо наступний за ним елемента, то це є індикатором того, що всі елементи масиву повністю відсортовані.

Таке правило дозволяє організувати порівняння елементів по-новому – тільки в парах сусідніх елементів. Так, якщо в методі лінійного сортування R[1] потрібно було порівнювати (на першому циклі) з R[2], R[3], . . ., R[n], то тепер R[1] досить порівняти тільки з R[2]. Якщо виявиться, що R[1] менше або дорівнює йому, то варто відразу ж перейти до порівняння R[2] c R[3], R[3] з R [4], . . . , R [ n-1 ] з R[n]. Якщо в результаті таких порівнянь буде виявлено, що якийсь елемент більший за наступний за ним елемента, то, помінявши їх місцями, потрібно продовжити процес порівнянні до кінця масиву.

Однак, якщо була зроблена перестановка значень, наприклад, між R[3] і R[4] елементами масиву, то може трапитися так, що нове значення R[3] (отримане з R[4]) буде менше, ніж R[2]. Із цього випливає, що, завершивши черговий цикл по елементах масиву, необхідно повернутися до його початку й знову повторити весь процес попарного порівняння елементів. Якщо в результаті чергового циклу не буде зроблено ні однієї перестановки, то це означає, що масив став упорядкованим.

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

Сформулюємо тепер алгоритм сортування методом “бульбашки”.

Повторювати наступний процес доти, доки не буде зареєстрований цикл, на якому не було ні однієї перестановки: порівнювати суміжні елементи масиву (тобто R[1] з R[2], R[2] з R[3], R[3] з R[4],...,R[ n-l] з R[n]). Якщо вони стоять за зменшенням значень, то поміняти їх місцями.

Метод одержав назву «метод бульбашки», оскільки в ньому мінімальне число масиву, аналогічно бульбашці повітря у воді, спливає на початок масиву (на поверхню води).

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

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

Приклад 1:

Одновимірні масиви. Є дані спостереження температури повітря за деякий період. Вимагається визначити середню і мінімальну температуру за цей період, підрахувати число днів, коли температура була вищою за 0.

program massiv;

uses Crt;

const n=10; {число елементів масиву};

var

i:integer; {змінна циклу for};

S:longint; {сума температур};

T_Sred:real; {середнє значення t};

T_min:integer; {min значення t};

n_pol:iteger; {кількість днів з додатною t};

T:array[1..n] of integer;

beign

clrscr;

writeln(‘Введіть масив з n елементів’);

for i:=1 to n do

read (T[i]); {читання елементів масиву};

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

for i:=1 to n do

write (T[i]:4);

writeln;

{Визначення T_min}

T_min:=T[1];

for i:=2 to n do

if T[i]<T_min

then

T_min:=T[i];

{Визначення T_Sred}

S:=q;

for i:=1 to n do

S:=S+T[i];

T_Sred:=S/n;

{Визначення n_pol}

n_pol:=0;

for i:=1 to n do

if T[i]>0

then

n_pol:=n_pol+1 {підрахунок числа позитивних значень T[i]};

writeln (‘T_Sredn= ‘,T_red:4:1,’T_min= ’,T_min,’n_pol= ‘,n_pol);

readln;

readln; {для затримки до натиснення Enter};

end.

Приклад 2:

Сортування. Метод лінійного сортування.

Умова задачі містить чотири пункти:

  1. Ввести масив R, що складається з n цілих чисел.

  2. Вивести на екран початковий масив.

  3. Відсортувати всі елементи масиву за збільшенням значень.

  4. Вивести на екран відсортований масив.

Для програмного втілення алгоритму лінійного сортування вводиться ще один параметр циклу for – змінна Candidat. Цією змінною позначатиметься кандидат на мінімальне значення при відборі кожного i-го члена зростаючої послідовності чисел. Згідно алгоритму, таким кандидатом може виявитися будь-який елемент масиву, що стоїть після i-гo елементу: i+1, i+2, i+3...n. Очевидно, що порівняння елементу R[i] з подальшими елементами масиву R, що залишилися, найзручніше організувати за допомогою циклу for.

for Candidate i+1 to n do if R[i]>R[Candidat]

then

{Переставити місцями елементи R[i] і R[Candidat]}

Якщо на місце елементу R[i] помістити (привласнити) елемент R[Candidat], то значення в комірці R[i] зникне назавжди; якщо ж, навпаки, комірці R[Candidat] привласнити величину з R[i], то виявиться втраченим значення в R[Candidat]. Проте такі втрати недопустимі, оскільки і R[i], і R[Candidat] повинні бути відповідними елементами відсортованого масиву. Тому для тимчасового зберігання R[i] (або R[Candidat]) вводиться змінна х.

program Lin_Sort;

uses Crt;

const n=5; {довжина масиву}

type

Int_n=1..n;

Mas=array[Int_n] of integer;

var

i:Int_n;{номер поточного елемента масиву}

Candidat:Int_n; {номер «кандидата» на мінімальне значення}

х:integer; {для тимчасового зберігання елемента масиву}

R:Mas; {масив цілих чисел}

beign

clrscr;

writeln('Введіть поелементно масив з ',n,' цілих чисел');

for i:=1 to n do

read(R[i]);

writeln('Вихідний масив R:');

for i:=1 to n do

write(R[i]:4);

writeln; {для виводу наступних повідомлень із нового рядка}

{Реалізація алгоритму лінійного сортування}

for i:=1 to n-1 do

for Candidat:=i+1 to n do

if R[i]>R[Candidat] then

begin

x:=R[i];

R[i]:=R[Candidat];

R[Candidat]:=x;

end;

writeln('Відсортований масив');

for i:=1 to n do

write(R[i]:4);

readln;

readln;

end.{Lin_Sort}

Приклад 3:

Сортування. Метод «бульбашки».

Блок програми, що реалізує алгоритм сортування, містить два вкладених цикли. Зовнішній цикл repeat_until займається лише тим, що постійно «повторює» внутрішній цикл for, поки не виявиться, що при черговому перегляді (проході) масиву не відбулося ні однієї перестановки елементів (при цьому S=0). Завданням циклу for є послідовне порівняння всіх пар суміжних елементів у масиві R. За один крок зовнішнього циклу внутрішній цикл завжди зробить (n-1) крок. Кількість повторень зовнішнього циклу заздалегідь невідомо, а визначається подією S=0.

Наприкінці кожного циклу в змінній S буде міститись число, значення якого дорівнює числу перестановок. Значення цього числа може змінюватися в інтервалі від 0 до n-1. Ясно, що новий цикл варто виконувати завжди, коли S не дорівнює нулю. При цьому фактичне число циклів не має значення, важливо, що воно більше нуля.

program Bulb_Sort;

uses Crt;

const n=5; {довжина масиву}

type

Int_n=0..n;

Mas=array[Int_n] of integer;

var

i:Int_n; {номер поточного елемента масиву}

х:integer; {для тимчасового зберігання елемента масиву}

R:Mas; {масив цілих чисел}

S:Int_n; {число перестановок у кожному циклі}

beign

clrscr;

writeln('Введіть поэлементно масив з ',n,' цілих чисел');

for 1:=1 to n do

read(R[i]);

writeln('Вихідний масив R:');

for l:=1 to n do

write(R[i]:4);

writeln; {для печатки наступних повідомлень із нового рядка}

{Реалізація алгоритму методом бульбашки}

repeat

S:=0; {очищення осередку перед нагромадженням суми}

for i:=1 to n-1 do

if R[i]>R[i+1]

then

begin

x:=R[i]; {організували тимчасове зберігання}

R[i]:=R[i+1];{перестановка елементів}

R[i+1]:=x;{масиву R[i] і R[i+1]}

S:=S+l; {лічильник числа перестановок}

end; {then}

until

S=0;

writeln('Відсортований масив');

for i:=1 to n do

write(R[i] :4);

readLn;

readLn;

end. {Bulb_Sort}

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