|
Serwis Edukacyjny Nauczycieli w I-LO w Tarnowie
Materiały głownie dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy Wałaszek |
©2026 mgr Jerzy Wałaszek
|
Algorytm sortowania bąbelkowego wykonuje dwa rodzaje operacji:
Pierwsza z tych operacji nie sortuje zbioru, jest więc operacją pustą. Druga operacja dokonuje faktycznej zmiany porządku elementów, jest zatem operacją sortującą.
Ze względu na przyjęty sposób sortowania algorytm bąbelkowy zawsze musi wykonać tyle samo operacji sortujących. Tego nie możemy zmienić. Jednakże możemy wpłynąć na eliminację operacji pustych. W ten sposób usprawnimy działanie algorytmu.
Jeśli dokładnie przyjrzałeś się wersjom 1 i 2, które prezentowaliśmy w poprzednich rozdziałach, to powinieneś dokonać następujących spostrzeżeń:
Możliwa jest dalsza redukcja operacji pustych, jeśli będziemy sprawdzać, czy w pętli wewnętrznej były przestawiane elementy (czyli czy wykonano operacje sortujące). Jeśli nie, to zbiór jest już posortowany (dlaczego?) i możemy zakończyć pracę algorytmu.
Teraz rośnie trudność wyznaczenia czasowej złożoności
obliczeniowej, ponieważ ilość faktycznie wykonywanych operacji porównań i przestawień zależy od rozkładu elementów w sortowanym zbiorze. Zadanie
komplikuje dodatkowo fakt, iż operacja pusta jest zwykle wykonywana kilkakrotnie
szybciej od operacji sortującej. Na pewno można powiedzieć, iż dla zbioru
posortowanego algorytm wykona tylko
Przykład:
Posortujmy zbiór
| Obieg | Zbiór | Opis operacji |
| 1 |
3 1 0 7 9 |
Konieczne przestawienie elementów |
1 3 0 7 9
|
Konieczne przestawienie elementów | |
1 0 3 7 9
|
Elementy w dobrej kolejności | |
1 0 3 7 9
|
Elementy w dobrej kolejności | |
1 0 3 7 9
|
Koniec pierwszego obiegu. Ponieważ były przestawienia elementów, sortowanie kontynuujemy |
|
| 2 |
1 0 3 7 9 |
Konieczne przestawienie elementów |
0 1 3 7 9 |
Elementy w dobrej kolejności | |
0 1 3 7 9 |
Elementy w dobrej kolejności | |
0 1 3 7 9
|
Koniec drugiego obiegu. Było przestawienie elementów, zatem sortowanie kontynuujemy |
|
| 3 |
0 1 3 7 9 |
Elementy w dobrej kolejności |
0 1 3 7 9 |
Elementy w dobrej kolejności | |
0 1 3 7 9
|
Koniec trzeciego obiegu. Nie było przestawień elementów, kończymy sortowanie. Wykonaliśmy o 1 obieg sortujący mniej. |
| n | - liczba elementów w sortowanym zbiorze, n ∈ N |
| d[ ] | - zbiór n-elementowy, który będzie sortowany. Elementy zbioru mają indeksy od 1 do n. |
| d[ ] | - posortowany zbiór n-elementowy. Elementy zbioru mają indeksy od 1 do n. |
| i, j | - zmienne sterujące pętli, i, j ∈ N |
| p | - znacznik zamiany miejsc elementów w zbiorze. p ∈ N |
| K01: | Dla j = n - 1, n - 2, ..., 1: Wykonuj kroki K02...K04 |
| K02: | p ← 1 |
| K03: | Dla i = 1, 2, ..., j: Jeśli d[i] > d[i + 1], to d[i] ↔ d[i + 1]; p ← 0 |
| K04: | Jeśli p = 1, to zakończ |
| K05: | Zakończ |

Wprowadzona do algorytmu sortowania bąbelkowego modyfikacja ma na celu wykrycie posortowania zbioru. Zmiany zaznaczyliśmy blokami o odmiennym kolorze.
Zbiór będzie posortowany, jeśli po wykonaniu wewnętrznego obiegu sortującego nie wystąpi ani jedno przestawienie elementów porządkowanego zbioru.
Przed wejściem do pętli sortującej nr 2 ustawiamy zmienną pomocniczą p. Jeśli w pętli zajdzie potrzeba przestawienia elementów, to zmienna p jest zerowana. Po wykonaniu pętli sortującej sprawdzamy, czy zmienna p jest ustawiona. Jeśli tak, to przestawienie elementów nie wystąpiło, zatem kończymy algorytm. W przeciwnym razie wykonujemy kolejny obieg pętli nr 1.
| Uwaga techniczna:
Zmienna
p powinna być typu liczbowego integer, a nie
boolean (chociaż tak może wydawać się właściwiej). Jednakże musimy
pamiętać, iż procesory Pentium są zoptymalizowane na liczby |
C++// Sortowanie Bąbelkowe - Wersja nr 3
//-----------------------------------
// (C)2012 mgr Jerzy Wałaszek
// I Liceum Ogólnokształcące
// im. K. Brodzińskiego
// w Tarnowie
#include <cmath>
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <time.h>
using namespace std;
const int N = 20; // Liczebność zbioru.
// Program główny
//---------------
int main()
{
int d[N],i,j,p;
cout << " Sortowanie babelkowe\n"
" WERSJA NR 3\n"
"----------------------\n"
"(C)2005 Jerzy Walaszek\n\n"
"Przed sortowaniem:\n\n";
// Najpierw wypełniamy tablicę d[]
// liczbami pseudolosowymi, a następnie
// wyświetlamy jej zawartość
srand((unsigned)time(NULL));
for(i = 0; i < N; i++)
d[i] = rand() % 100;
for(i = 0; i < N; i++)
cout << setw(4) << d[i];
cout << endl << endl;
// Sortujemy
for(j = N - 1; j > 0; j--)
{
p = 1;
for(i = 0; i < j; i++)
if(d[i] > d[i + 1])
{
swap(d[i], d[i + 1]);
p = 0;
}
if(p) break;
}
// Wyświetlamy wynik sortowania
cout << "Po sortowaniu:\n\n";
for(i = 0; i < N; i++)
cout << setw(4) << d[i];
cout << endl << endl;
system("pause");
return 0;
}
|
Pascal// Sortowanie Bąbelkowe - Wersja nr 3
//-----------------------------------
// (C)2012 mgr Jerzy Wałaszek
// I Liceum Ogólnokształcące
// im. K. Brodzińskiego
// w Tarnowie
program Bubble_Sort_3;
const N = 20; // Liczebność zbioru.
var
d : array[1..N] of integer;
// Program główny
//---------------
var
i,j,p,x : integer;
begin
writeln(' Sortowanie babelkowe ');
writeln(' WERSJA NR 3 ');
writeln('----------------------');
writeln('(C)2005 Jerzy Walaszek');
writeln;
// Najpierw wypełniamy tablicę d[]
// liczbami pseudolosowymi, a następnie
// wyświetlamy jej zawartość
randomize;
for i := 1 to N do d[i] := random(100);
writeln('Przed sortowaniem:'); writeln;
for i := 1 to N do write(d[i] : 4);
writeln;
writeln;
// Sortujemy
for j := N - 1 downto 1 do
begin
p := 1;
for i := 1 to j do
if d[i] > d[i+1] then
begin
x := d[i]; d[i] := d[i+1]; d[i+1] := x;
p := 0;
end;
if p = 1 then break;
end;
// Wyświetlamy wynik sortowania
writeln('Po sortowaniu:'); writeln;
for i := 1 to N do write(d[i] : 4);
writeln;
writeln;
writeln('Nacisnij Enter...');
readln;
end.
|
Basic' Sortowanie Bąbelkowe - Wersja nr 3
'-----------------------------------
' (C)2012 mgr Jerzy Wałaszek
' I Liceum Ogólnokształcące
' im. K. Brodzińskiego
' w Tarnowie
CONST N = 20 ' Liczebność zbioru.
DIM AS INTEGER d(1 TO N), i, j, p
PRINT " Sortowanie babelkowe "
PRINT " WERSJA NR 3 "
PRINT "----------------------"
PRINT "(C)2005 Jerzy Walaszek"
PRINT
' Najpierw wypełniamy tablicę d[]
' liczbami pseudolosowymi, a następnie
' wyświetlamy jej zawartość
RANDOMIZE TIMER
FOR i = 1 TO N
d(i) = INT(RND * 100)
NEXT
PRINT "Przed sortowaniem:"
PRINT
FOR i = 1 TO N
PRINT USING "####"; d(i);
NEXT
PRINT
PRINT
' Sortujemy
FOR j = N - 1 TO 1 STEP -1
p = 1
FOR i = 1 TO j
IF d(i) > d(i+1) THEN
SWAP d(i), d(i+1)
p = 0
END IF
NEXT
IF p = 1 THEN EXIT FOR
NEXT
' Wyświetlamy wynik sortowania
PRINT "Po sortowaniu:"
PRINT
FOR i = 1 TO N
PRINT USING "####"; d(i);
NEXT
PRINT
PRINT
PRINT "Nacisnij Enter..."
SLEEP
END
|
Python
(dodatek)# Sortowanie Bąbelkowe - Wersja nr 3
#-----------------------------------
# (C)2026 mgr Jerzy Wałaszek
# I Liceum Ogólnokształcące
# im. K. Brodzińskiego
# w Tarnowie
import random
n = 20 # Liczebność zbioru.
# Sortowany zbiór
d = [random.randrange(100) for i in range(n)]
print(" Sortowanie bąbelkowe ")
print(" WERSJA NR 3 ")
print("----------------------")
print("(C)2026 Jerzy Wałaszek")
print()
# wyświetlamy zbiór
print("Przed sortowaniem:")
print()
for i in range(n):
print("%4d" % (d[i]), end="")
print()
print()
# Sortujemy
for j in reversed(range(n)):
p = True
for i in range(j):
if d[i] > d[i+1]:
d[i],d[i+1] = d[i+1],d[i]
p = False
if p: break
# Wyświetlamy wynik sortowania
print("Po sortowaniu:")
print()
for i in range(n):
print("%4d" % (d[i]), end="")
print()
print()
input("Nacisnij Enter...")
|
| Wynik: |
Sortowanie bąbelkowe
WERSJA NR 3
----------------------
(C)2026 Jerzy Wałaszek
Przed sortowaniem:
17 71 65 10 66 50 28 8 63 14 72 21 6 26 17 12 68 30 63 23
Po sortowaniu:
6 8 10 12 14 17 17 21 23 26 28 30 50 63 63 65 66 68 71 72
Nacisnij Enter...
|
JavaScript<html>
<head>
</head>
<body>
<form style="BORDER-RIGHT: #ff9933 1px outset;
PADDING-RIGHT: 4px; BORDER-TOP: #ff9933 1px outset;
PADDING-LEFT: 4px; PADDING-BOTTOM: 1px;
BORDER-LEFT: #ff9933 1px outset; PADDING-TOP: 1px;
BORDER-BOTTOM: #ff9933 1px outset;
BACKGROUND-COLOR: #ffcc66" name="frmbubblesort">
<h3 style="text-align: center">Sortowanie Bąbelkowe - wersja nr 3</h3>
<p style="TEXT-ALIGN: center">
(C)2012 mgr Jerzy Wałaszek - I LO w Tarnowie
</p>
<hr>
<p style="TEXT-ALIGN: center">
<input onclick="main()" type="button" value="Sortuj" name="B1">
</p>
<p id="t_out" style="TEXT-ALIGN: center">...</p>
</form>
<script language=javascript>
// Sortowanie Bąbelkowe - wersja nr 3
//--------------------------------------------------------
// (C)2012 mgr Jerzy Wałaszek
// I Liceum Ogólnokształcące
// im. K. Brodzińskiego
// w Tarnowie
//--------------------------------------------------------
var N = 20; // Liczebność zbioru.
function main()
{
var d = new Array(N);
var i,j,p,x,t;
// Najpierw wypełniamy tablicę d[] liczbami pseudolosowymi
for(i = 0; i < N; i++) d[i] = Math.floor(Math.random() * 100);
t = "Przed sortowaniem:<BR><BR>";
for(i = 0; i < N; i++) t += d[i] + " ";
t += "<BR><BR>";
// Sortujemy
for(j = N - 1; j > 0; j--)
{
p = 1;
for(i = 0; i < j; i++)
if(d[i] > d[i + 1])
{
x = d[i]; d[i] = d[i + 1]; d[i + 1] = x;
p = 0;
}
if(p) break;
}
// Wyświetlamy wynik sortowania
t += "Po sortowaniu:<BR><BR>";
for(i = 0; i < N; i++) t += d[i] + " ";
document.getElementById("t_out").innerHTML = t;
}
</script>
</body>
</html> |
| Cechy
Algorytmu Sortowania Bąbelkowego wersja nr 3 |
|
| klasa złożoności obliczeniowej optymistyczna | O(n) ... O(n2) |
| klasa złożoności obliczeniowej typowa | O(n2) |
| klasa złożoności obliczeniowej pesymistyczna | O(n2) |
| Sortowanie w miejscu | TAK |
| Stabilność | TAK |
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.