i sprawdzamy, czy bieżący element nie jest większy od następnego. Jeżeli tak, to zamieniamy je ze sobą. Przechodzenie przez tablicę wykonujemy tyle razy, aż w czasie pojedynczego przejścia nie musimy wykonać już żadnej zamiany. Oznacza to, że tablica jest już posortowana.
Zauważ, że tablica porządkuje się „od końca”. Przy każdym przebiegu tablicy przynajmniej jeden element dołącza do już uporządkowanej końcówki. Dlatego w każdym przebiegu musimy sprawdzać coraz krótszy fragment.
program cw4_03;
{ Program zapełnia tablice losowymi liczbami }
{ i porządkuje je niemalejaco. }
{ Katalog r4_01 : 4_03.pas }
var
Liczby : array [1..20] of Byte;
I, Pom : Byte;
Ilosc : Byte;
Zamiana : Boolean;
procedurę WypiszTablice;
{ Procedura wypisuje tablice Liczby. } var
I : Byte; begin
for I :- 1 to 20 do
Write (LiczbyCI], ' ');
Writeln;
end; {--------------WypiszTablice -}
begin
Randomize;
for I := 1 to 20 do
LiczbyCI] Random (20) + 1;
Writeln; Write ('Tablica:
WypiszTablice;
Ilosc 20; repeat
Zamiana False;
Ilosc Ilosc - 1;
for I 1 to Ilosc do
if (LiczbyCI] > LiczbyCI+1]) then begin
Pom LiczbyCI]; LiczbyCI] := LiczbyCI+1]; LiczbyCI+1]:- Pom;
Zamiana True; end;
until not Zamiana;
Write ('Tablica posortowana: ');
WypiszTablice;
Readln; end.
Zmienna Ilosc określa nieuporządkowaną część tablicy (zauważ, że jest od niej o 1 mniejsza, ponieważ porównujemy zawsze dwa sąsiednie elementy i pod koniec interesuje nas indeks niższego). Zmienna Zamiana informuje nas, czy w danym przebiegu pętli odbyła się zamiana danych. Jeżeli chciałbyś zobaczyć, jak zmienia się zawartość tabeli w czasie pracy algorytmu, wstaw przed słowem until jeszcze jedno wywołanie procedury WypiszTablice.