Algorytm sortowania b膮belkowego jest jednym z najstarszych algorytm贸w sortuj膮cych. Mo偶na go potraktowa膰 jako ulepszenie opisanego w poprzednim rozdziale algorytmu sortowania g艂upiego. Zasada dzia艂ania opiera si臋 na cyklicznym por贸wnywaniu par s膮siaduj膮cych element贸w i zamianie ich kolejno艣ci w przypadku niespe艂nienia kryterium porz膮dkowego zbioru. Operacj臋 t臋 wykonujemy dot膮d, a偶 ca艂y zbi贸r zostanie posortowany.
Algorytm sortowania b膮belkowego przy porz膮dkowaniu zbioru nieposortowanego ma klas臋 czasowej z艂o偶ono艣ci obliczeniowej r贸wn膮 O(n2). Sortowanie odbywa si臋 w miejscu.
Jako przyk艂ad dzia艂ania algorytmu sortowania b膮belkowego posortujemy przy jego pomocy 5-cio elementowy zbi贸r liczb {5 4 3 2 1}, kt贸ry wst臋pnie jest posortowany w kierunku odwrotnym, co mo偶emy uzna膰 za przypadek najbardziej niekorzystny, poniewa偶 wymaga przestawienia wszystkich element贸w.
Obieg |
Zbi贸r |
Opis operacji |
1 |
聽5聽4聽3聽2聽1聽 |
Rozpoczynamy od pierwszej pary, kt贸ra wymaga wymiany element贸w |
|
聽4聽5聽3聽2聽1聽 |
Druga para te偶 wymaga zamiany element贸w |
|
聽4聽3聽5聽2聽1聽 |
Wymagana wymiana element贸w |
|
聽4聽3聽2聽5聽1聽 |
Ostatnia para r贸wnie偶 wymaga wymiany element贸w |
|
聽4聽3聽2聽1聽5聽 |
Stan po pierwszym obiegu. Zwr贸膰 uwag臋, i偶 najstarszy element (5) znalaz艂 si臋 na ko艅cu zbioru, a聽najm艂odszy (1) przesun膮艂 si臋 o jedn膮 pozycj臋 w lewo. |
2 |
聽4聽3聽2聽1聽5聽 |
Para wymaga wymiany |
|
聽3聽4聽2聽1聽5聽 |
Para wymaga wymiany |
|
聽3聽2聽4聽1聽5聽 |
Para wymaga wymiany |
|
聽3聽2聽1聽4聽5聽 |
Elementy s膮 w dobrej kolejno艣ci, zamiana nie jest konieczna. |
|
聽3聽2聽1聽4聽5聽 |
Stan po drugim obiegu. Zwr贸膰 uwag臋, i偶 najmniejszy element (1) zn贸w przesun膮艂 si臋 o聽jedn膮 pozycj臋 w聽lewo. Z obserwacji tych mo偶na wywnioskowa膰, i偶 po ka偶dym obiegu najmniejszy element w臋druje o聽jedn膮 pozycj臋 ku pocz膮tkowi zbioru. Najstarszy element zajmuje natomiast swe miejsce ko艅cowe. |
3 |
聽3聽2聽1聽4聽5聽 |
Para wymaga wymiany |
|
聽2聽3聽1聽4聽5聽 |
Para wymaga wymiany |
|
聽2聽1聽3聽4聽5聽 |
Dobra kolejno艣膰 |
|
聽2聽1聽3聽4聽5聽 |
Dobra kolejno艣膰 |
|
聽2聽1聽3聽4聽5聽 |
Stan po trzecim obiegu. Wnioski te same. |
4 |
聽2聽1聽3聽4聽5聽 |
Para wymaga wymiany |
|
聽1聽2聽3聽4聽5聽 |
Dobra kolejno艣膰 |
|
聽1聽2聽3聽4聽5聽 |
Dobra kolejno艣膰 |
|
聽1聽2聽3聽4聽5聽 |
Dobra kolejno艣膰 |
|
聽1聽2聽3聽4聽5聽 |
Zbi贸r jest posortowany. Koniec |
Posortowanie naszego zbioru wymaga 4 obieg贸w. Jest to oczywiste: w przypadku najbardziej niekorzystnym najmniejszy element znajduje si臋 na samym ko艅cu zbioru wej艣ciowego. Ka偶dy obieg przesuwa go o jedn膮 pozycj臋 w kierunku pocz膮tku zbioru. Takich przesuni臋膰 nale偶y wykona膰 n - 1 (n - ilo艣膰 element贸w w zbiorze).
Algorytm sortowania b膮belkowego, w przeciwie艅stwie do algorytmu sortowania g艂upiego, nie przerywa por贸wnywania par element贸w po napotkaniu pary nie spe艂niaj膮cej za艂o偶onego porz膮dku. Po zamianie kolejno艣ci element贸w sprawdzana jest kolejna para element贸w sortowanego zbioru. Dzi臋ki temu podej艣ciu ro艣nie efektywno艣膰 algorytmu oraz zmienia si臋 klasa czasowej z艂o偶ono艣ci obliczeniowej z O(n3) na O(n2).
// Sortowanie B膮belkowe - Wersja nr 1
//-------------------------------------------------
// (C)2005 mgr Jerzy Wa艂aszek
// I Liceum Og贸lnokszta艂c膮ce
// im. K. Brodzi艅skiego
// w Tarnowie
//-------------------------------------------------
#include <cmath>
#include <iostream>
#include <iomanip>
using namespace std;
const int N = 20; // Liczebno艣膰 zbioru.
// Program g艂贸wny
//---------------
main()
{
int d[N],i,j;
cout << " Sortowanie babelkowe\n"
" WERSJA NR 1\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;
// Sortujemy
for(j = 0; j < N - 1; j++)
for(i = 0; i < N - 1; i++)
if(d[i] > d[i + 1]) swap(d[i], d[i + 1]);
// Wy艣wietlamy wynik sortowania
cout << "Po sortowaniu:\n\n";
for(i = 0; i < N; i++) cout << setw(4) << d[i];
cout << endl;
system("PAUSE");
}