|
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
|
Podany w poprzednim rozdziale algorytm sortowania kubełkowego jest bardzo uproszczony i pozwala sortować tylko liczby całkowite. Teraz opiszemy pełny algorytm sortowania kubełkowego pozbawiony tych ograniczeń. Najpierw kilka założeń i definicji:
Sortujemy zbiór
![]() |
Poszczególne kubełki to:
| dla i = 0,1,...,m: [wmin + i • szkb , wmin + (i +1) • szkb] |
czyli
| K[0] : | <wmin , wmin + szkb) |
| K[1] : | <wmin + szk , wmin + 2 • szkb) |
| ... | |
| K[m - 1] : | <wmin + (m - 1) • szkb, wmax) |
| K[m] : | <wmax , wmax + szkb) |
Ponieważ poszczególne kubełki tworzą przedziały prawostronnie otwarte,
potrzebujemy ostatniego kubełka K[m]
dla wartości maksymalnej wmax, którą mogą osiągać
elementy w sortowanym zbiorze. Wynika stąd, iż kubełków będzie
Liczba d[j] należy do i-tego kubełka, jeśli spełniona jest nierówność:
| wmin + i •
szkb
|
A stąd otrzymujemy wzór na numer kubełka:
![]() |
Po wyznaczeniu przedziału kubełków, zerujemy kubełki (tzn. tworzymy w nich puste listy elementów). Następnie przeglądamy kolejno wszystkie elementy zbioru, wyznaczamy dla nich odpowiednie kubełki i wstawiamy te elementy to kubełków. Operację wstawiania do kubełka wykonujemy, tak aby wewnątrz kubełka elementy tworzyły listę posortowaną. Jeśli kubełków będzie odpowiednio dużo, to zawierać będą niewiele elementów, zatem operacja tworzenia listy uporządkowanej nie zajmie dużo czasu.
Po wykonaniu przebiegu dystrybucyjnego w poszczególnych kubełkach będziemy posiadali uporządkowane listy elementów. Wykonujemy przebieg zbierający - przeglądamy poszczególne kubełki pobierając z list przechowywane w nich elementy i umieszczając je w zbiorze wynikowym. W efekcie otrzymamy zbiór posortowany.
Przykład:
Dla zobrazowania zasady sortowania kubełkowego posortujemy tą metodą poniższy zbiór liczb:
| { 23/4 11/4 4/5 41/2 14/5 1/2 } |
Określamy zakres wartości elementów zbioru:
| wmin = 1/2 wmax = 41/2 |
Ustalamy liczbę kubełków m = 4.
Wyliczamy szerokość kubełka:
![]() |
Wyznaczamy zakresy kolejnych kubełków:
| K[0] : <1/2, 11/2) K[1] : <11/2, 21/2) K[2] : <21/2, 31/2) K[3] : <31/2, 41/2) K[4] : <41/2, 51/2) |
Poszczególne elementy zbioru umieszczamy w kubełkach, których numery wyznaczamy ze wzoru:
![]() |
| 23/4 : i = [ | 23/4 - 1/2 | ] = [21/4] = 2 |
| 1 | ||
| 11/4 : i = [ | 11/4 - 1/2 | ] = [3/4] = 0 |
| 1 | ||
| 4/5 : i = [ | 4/5 - 1/2 | ] = [3/10] = 0 |
| 1 | ||
| 41/2 : i = [ | 41/2 - 1/2 | ] = [4] = 4 |
| 1 | ||
| 14/5 : i = [ | 14/5 - 1/2 | ] = [13/10] = 1 |
| 1 | ||
| 1/2 : i = [ | 1/2 - 1/2 | ] = [0] = 0 |
| 1 |
Kubełki mają następującą zawartość:
| K[0] : | [1/2, 11/2) | : | 1/2 | , 4/5 | , 11/4 |
| K[1] : | [11/2, 21/2) | : | 14/5 | ||
| K[2] : | [21/2, 31/2) | : | 23/4 | ||
| K[3] : | [31/2, 41/2) | : | |||
| K[4] : | [41/2, 51/2) | : | 41/2 |
Pobieramy elementy z kolejnych kubełków i umieszczamy je w zbiorze wynikowym. Zbiór jest posortowany.
| { 1/2 4/5 11/4 14/5 23/4 41/2 } |
Elementy umieszczane w kolejnych kubełkach muszą być posortowane rosnąco. Do sortowania wykorzystamy naturalny w tym przypadku algorytm sortowania przez wstawianie. Dla listy przyjmuje on następującą postać:
| L[ ] | - tablica elementów, z których zbudowana jest lista. Każdy element posiada pole następnik oraz pole dane. |
| K[ ] | - tablica nagłówków list. Elementy K[ ] są liczbami całkowitymi. |
| ine | - indeks nowego elementu w tablicy L[ ], który będzie dodany do listy kubełka, ine ∈ N |
| ikb | - indeks kubełka w tablicy K[ ], do listy którego dodajemy element, ikb ∈ N |
| we | - wartość dodawanego elementu, we ∈ R |
Na liście kubełka K[ikb] zostaje umieszczony nowy element o wartości pola dane równej we. Lista jest posortowana rosnąco
| ip | - indeks poprzedniego elementu na liście, ip ∈ C |
| ib | - indeks bieżącego elementu na liście, ib ∈ C |
| K01: | L[ine].następnik ← 0; L[ine].dane ← we | Inicjujemy nowy element listy |
| K02: | ip ← 0; ib ← K[ikb] | Inicjujemy wskaźniki poprzedniego elementu oraz bieżącego |
| K03: | Dopóki (ib > 0) ∧ (L[ib].dane
< we) wykonuj: ip ← ib ib ← L[ib].następnik |
Szukamy miejsca wstawienia nowego elementu na liście skojarzonej z kubełkiem |
| K04: | Jeśli ip = 0, to: L[ine].następnik ← ib; K[ikb] ← ine idź do kroku K07 |
Jeśli wskaźnik poprzedniego elementu listy jest równy 0, to
pętla z kroku 3 nie wykonała ani jednego obiegu. Dzieje się tak w dwóch przypadkach:
W obu przypadkach nowy element należy wstawić na początek listy. Po tej operacji przechodzimy na koniec algorytmu do kroku 7 |
| K05: | Jeśli ib = 0, to: L[ip].następnik ← ine Idź do kroku K07 |
Jeśli wskaźnik bieżącego elementu jest równy 0, to nowy element należy wstawić na koniec listy - za elementem wskazywanym przez wskaźnik ip. Po tej operacji przechodzimy do kroku 7 |
| K06: | L[ip].następnik ←
ine L[ine].następnik ← ib |
Jeśli nie wystąpiły dwie poprzednie sytuacje, to pozostaje jedynie wstawienie nowego elementu pomiędzy elementy wskazywane przez ip oraz ib. |
| K07: | ine ← ine + 1 Zakończ |
Zwiększamy wskaźnik wolnej pozycji w tablicy elementów list |
| n | - liczba elementów do posortowania; n ∈ N |
| d[ ] | - tablica n-elementowa z elementami rzeczywistymi do posortowania. Indeks pierwszego elementu wynosi 1. |
| wmin | - najmniejszy element w tablicy d[ ]; wmin ∈ R |
| wmax | - największy element w tablicy d[ ]; wmax ∈ R |
| d[ ] | - tablica z posortowanymi rosnąco elementami |
| L[ ] | - | n-elementowa tablica elementów list. Każdy element posiada całkowite pole następnik oraz rzeczywiste pole dane. Indeksy elementów rozpoczynają się od wartości 1. |
| K[ ] | - | tablica (n + 1) elementowa zawierająca nagłówki list kubełków. Każdy element jest liczbą całkowitą. Indeksy elementów rozpoczynają się od wartości 0. |
| szkb | - | szerokość przedziału objętego przez kubełek, szkb ∈ R |
| ikb | - | wyznaczony dla danego elementu numer kubełka, ikb ∈ C |
| ine | - | indeks wolnej pozycji w tablicy L[ ]; ine ∈ N |
| i,j | - | zmienne licznikowe pętli; i,j Î C |
| we | - | wartość sortowanego elementu; we ∈ R |
| K01: | Dla i = 0,1,...,n: wykonuj: K[i] ← 0 |
| K02: |
![]() |
| K03: | ine ← 1 |
| K04: | Dla i = 1,2,...,n: wykonuj kroki K05...K07 |
| K05: | we ← d[i] |
| K06: |
![]() |
| K07: | Wstaw wartość we na listę kubełka K[ikb] |
| K08: | j ← 1 |
| K09: | Dla ikb = 0,1,...,n: wykonuj kroki K10...K13 |
| K10: | i ← K[ikb] |
| K11: | Dopóki i > 0: wykonuj kroki K12...K14 |
| K12: | d[j] ← L[i].dane |
| K13: | j ← j + 1 |
| K14: | i ← L[i].następnik |
| K15: | Zakończ |

Pierwszą operacją algorytmu jest wyzerowanie nagłówków list
Elementy list będziemy tworzyli kolejno w tablicy
Rozpoczynamy pętlę nr 1, której zadaniem jest umieszczenie wszystkich
elementów zbioru
Druga faza algorytmu ma za zadanie pozbierać elementy z poszczególnych
list uporządkowanych zawartych w kubełkach
Zmienna j pełni rolę indeksu wstawianych do d[ ] elementów. Dlatego
przyjmuje wartość 1 - początek tablicy
Pętla nr 2 wyznacza kolejne kubełki
Pętla wewnętrzna nr 3 przegląda elementy listy danego kubełka i zapisuje
je do zbioru
Po zakończeniu pętli nr 2 w zbiorze
C++// Sortowanie kubełkowe - wersja II
//--------------------------------------------------------
// (C)2012 mgr Jerzy Wałaszek
// I Liceum Ogólnokształcące
// im. K. Brodzińskiego
// w Tarnowie
//--------------------------------------------------------
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <time.h>
using namespace std;
const int N = 40;
const double WMIN = -1000.0;
const double WMAX = 1000.0;
int main()
{
struct
{
unsigned nastepnik;
double dane;
} L[N + 1];
double d[N],we,szkb;
int K[N + 1],ikb,ine,ip,ib,i,j;
cout.precision(2); // 2 cyfry po przecinku
cout.setf(ios::fixed); // format stałoprzecinkowy
cout << " Sortowanie Kubelkowe II \n"
"------------------------------\n"
" (C)2005 mgr Jerzy Walaszek \n\n"
"Przed sortowaniem:\n\n";
// Generujemy zawartość tablicy d[] i wyświetlamy ją
srand((unsigned)time(NULL));
for(i = 0; i < N; i++)
{
d[i] = WMIN + (double)rand() / (double)(RAND_MAX+1) * (WMAX - WMIN);
cout << setw(8) << d[i];
}
cout << endl;
// Zerujemy kubełki
for(i = 0; i <= N; i++) K[i] = 0;
// Obliczamy szerokość kubełka
szkb = (WMAX - WMIN) / N;
ine = 1;
// Rozrzucamy poszczególne elementy d[i] na listach K[]
for(i = 0; i < N; i++)
{
we = d[i];
ikb = (int)((we - WMIN) / szkb);
L[ine].nastepnik = 0; L[ine].dane = we;
ip = 0; ib = K[ikb];
while((ib > 0) && (L[ib].dane < we))
{
ip = ib; ib = L[ib].nastepnik;
}
if(!ip)
{
L[ine].nastepnik = ib; K[ikb] = ine;
}
else if(!ib) L[ip].nastepnik = ine;
else
{
L[ip].nastepnik = ine; L[ine].nastepnik = ib;
}
ine++;
}
// wybieramy dane z kubełków i umieszczamy je w d[]
j = 0;
for(ikb = 0; ikb <= N; ikb++)
{
i = K[ikb];
while(i)
{
d[j++] = L[i].dane; i = L[i].nastepnik;
}
}
// Koniec. Wyświetlamy wyniki
cout << "Po sortowaniu:\n\n";
for(i = 0; i < N; i++) cout << setw(8) << d[i];
cout << endl;
return 0;
}
|
Pascal// Sortowanie kubełkowe - wersja II
//--------------------------------------------------------
// (C)2012 mgr Jerzy Wałaszek
// I Liceum Ogólnokształcące
// im. K. Brodzińskiego
// w Tarnowie
//--------------------------------------------------------
const
N = 40;
WMIN = -1000.0;
WMAX = 1000.0;
// Tutaj definiujemy typ elementów listy
type
TElement = record
nastepnik : cardinal;
dane : real;
end;
// Tutaj deklarujemy zmienne
var
d : array[1..N] of real;
L : array[1..N] of TElement;
K : array[0..N] of integer;
we,szkb : real;
ikb,ine,ip,ib,i,j : integer;
begin
writeln(' Sortowanie Kubelkowe II ');
writeln('------------------------------');
writeln(' (C)2005 mgr Jerzy Walaszek ');
writeln;
// Generujemy zawartość tablicy d[] i wyświetlamy ją
randomize;
writeln('Przed sortowaniem:');
writeln;
for i := 1 to N do
begin
d[i] := WMIN + random() * (WMAX - WMIN);
write(d[i]:8:2);
end;
writeln;
// Zerujemy kubełki
for i := 0 to N do K[i] := 0;
// Obliczamy szerokość kubełka
szkb := (WMAX - WMIN) / N;
ine := 1;
// Rozrzucamy poszczególne elementy d[i] na listach K[]
for i := 1 to N do
begin
we := d[i];
ikb := round((we - WMIN) / szkb);
L[ine].nastepnik := 0; L[ine].dane := we;
ip := 0; ib := K[ikb];
while (ib > 0) and (L[ib].dane < we) do
begin
ip := ib; ib := L[ib].nastepnik;
end;
if ip = 0 then
begin
L[ine].nastepnik := ib; K[ikb] := ine
end
else if ib = 0 then
L[ip].nastepnik := ine
else
begin
L[ip].nastepnik := ine; L[ine].nastepnik := ib;
end;
inc(ine);
end;
// wybieramy dane z kubełków i umieszczamy je w d[]
j := 1;
for ikb := 0 to N do
begin
i := K[ikb];
while i > 0 do
begin
d[j] := L[i].dane;
inc(j); i := L[i].nastepnik;
end;
end;
// Koniec. Wyświetlamy wyniki
writeln('Po sortowaniu:');
writeln;
for i := 1 to N do write(d[i]:8:2);
writeln;
writeln('KONIEC. Nacisnij klawisz Enter...');
readln;
end.
|
Basic' Sortowanie kubełkowe - wersja II
'--------------------------------------------------------
' (C)2012 mgr Jerzy Wałaszek
' I Liceum Ogólnokształcące
' im. K. Brodzińskiego
' w Tarnowie
'--------------------------------------------------------
OPTION EXPLICIT
CONST N = 40
CONST WMIN = -1000
CONST WMAX = 1000
' Tutaj definiujemy typ elementów listy
TYPE TElement
nastepnik AS UINTEGER
dane AS DOUBLE
END TYPE
' Tutaj deklarujemy zmienne
DIM AS DOUBLE d(N),we,szkb
DIM AS TElement L(N)
DIM AS INTEGER K(0 TO N),ikb,ine,ip,ib,i,j
PRINT " Sortowanie Kubelkowe II "
PRINT "------------------------------"
PRINT " (C)2005 mgr Jerzy Walaszek "
PRINT
' Generujemy zawartość tablicy d[] i wyświetlamy ją
RANDOMIZE
PRINT "Przed sortowaniem:"
PRINT
FOR i = 1 TO N
d(i) = WMIN + RND(1) * (WMAX - WMIN)
PRINT USING "#####.##"; d(i);
NEXT
PRINT
' Zerujemy kubełki
FOR i = 0 TO N: K(i) = 0: NEXT
' Obliczamy szerokość kubełka
szkb = (WMAX - WMIN) / N
ine = 1
' Rozrzucamy poszczególne elementy d[i] na listach K[]
FOR i = 1 TO N
we = d(i)
ikb = INT((we - WMIN) / szkb)
L(ine).nastepnik = 0: L(ine).dane = we
ip = 0: ib = K(ikb)
WHILE (ib > 0) AND (L(ib).dane < we)
ip = ib: ib = L(ib).nastepnik
WEND
IF ip = 0 THEN
L(ine).nastepnik = ib: K(ikb) = ine
ELSEIF ib = 0 THEN
L(ip).nastepnik = ine
ELSE
L(ip).nastepnik = ine: L(ine).nastepnik = ib
END IF
ine += 1
NEXT
' wybieramy dane z kubełków i umieszczamy je w d[]
j = 1
FOR ikb = 0 TO N
i = K(ikb)
WHILE i > 0
d(j) = L(i).dane
j += 1: i = L(i).nastepnik
WEND
NEXT
' Koniec. Wyświetlamy wyniki
PRINT "Po sortowaniu:"
PRINT
FOR i = 1 TO N: PRINT USING "#####.##"; d(i);: NEXT
PRINT
PRINT "KONIEC. Nacisnij dowolny klawisz..."
SLEEP
END
|
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="frmbucketsort">
<h3 style="text-align: center">Sortowanie Kubełkowe II</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 kubełkowe - wersja II
//--------------------------------------------------------
// (C)2012 mgr Jerzy Wałaszek
// I Liceum Ogólnokształcące
// im. K. Brodzińskiego
// w Tarnowie
//--------------------------------------------------------
var N = 40;
var WMIN = -1000;
var WMAX = 1000;
var d = new Array();
var L = new Array();
var K = new Array();
var we,szkb,ikb,ine,ip,ib,i,j,t;
for(i = 1; i <= N; i++) L[i] = new Object();
function main()
{
// Generujemy zawartość tablicy d[] i wyświetlamy ją
t = "Przed sortowaniem:<BR><BR>";
for(i = 0; i < N; i++)
{
d[i] = WMIN + Math.random() * (WMAX - WMIN);
t += d[i].toFixed(2) + " ";
if(!((i + 1) % 10)) t += "<BR>";
}
t += "<BR>";
// Zerujemy kubełki
for(i = 0; i <= N; i++) K[i] = 0;
// Obliczamy szerokość kubełka
szkb = (WMAX - WMIN) / N;
ine = 1;
// Rozrzucamy poszczególne elementy d[i] na listach K[]
for(i = 0; i < N; i++)
{
we = d[i];
ikb = Math.floor((we - WMIN) / szkb);
L[ine].nastepnik = 0; L[ine].dane = we;
ip = 0; ib = K[ikb];
while((ib > 0) && (L[ib].dane < we))
{
ip = ib; ib = L[ib].nastepnik;
}
if(!ip)
{
L[ine].nastepnik = ib; K[ikb] = ine;
}
else if(!ib) L[ip].nastepnik = ine;
else
{
L[ip].nastepnik = ine; L[ine].nastepnik = ib;
}
ine++;
}
// wybieramy dane z kubełków i umieszczamy je w d[]
j = 0;
for(ikb = 0; ikb <= N; ikb++)
{
i = K[ikb];
while(i)
{
d[j++] = L[i].dane; i = L[i].nastepnik;
}
}
// Koniec. Wyświetlamy wyniki
t += "Po sortowaniu:<BR><BR>";
for(i = 0; i < N; i++)
{
t += d[i].toFixed(2) + " ";
if(!((i + 1) % 10)) t += "<BR>";
}
document.getElementById("t_out").innerHTML = t;
}
</script>
</body>
</html>
|
| Wynik: |
| Sortowanie Kubelkowe II ------------------------------ (C)2005 mgr Jerzy Walaszek Przed sortowaniem: -508.97 417.11 180.18 457.34 355.41 -813.29 -25.21 189.09 -464.17 -649.78 -126.22 811.71 244.45 889.28 77.94 286.25 -92.35 596.31 -4.15 28.44 353.39 -238.40 433.72 589.48 18.92 -198.85 -39.25 809.69 -260.31 -860.96 -487.18 257.20 683.59 -344.36 297.30 -235.84 -8.61 15.26 -939.39 -126.28 Po sortowaniu: -939.39 -860.96 -813.29 -649.78 -508.97 -487.18 -464.17 -344.36 -260.31 -238.40 -235.84 -198.85 -126.28 -126.22 -92.35 -39.25 -25.21 -8.61 -4.15 15.26 18.92 28.44 77.94 180.18 189.09 244.45 257.20 286.25 297.30 353.39 355.41 417.11 433.72 457.34 589.48 596.31 683.59 809.69 811.71 889.28 |
W celach badawczych testujemy czas wykonania algorytmu sortowania kubełkowego w środowisku opisanym we wstępie. Program testujący jest następujący:
Pascal// Program testujący czas sortowania dla
// danego algorytmu sortującego
//--------------------------------------
// (C)2012 mgr Jerzy Wałaszek
// I Liceum Ogólnokształcące
// w Tarnowie
//--------------------------------------
program TestCzasuSortowania;
uses Windows;
const
NAZWA = 'Sortowanie kubełkowe';
K1 = '-----------------------------------------------------------';
K2 = '(C)2011/2012 I Liceum Ogolnoksztalcace w Tarnowie';
K3 = '------n---------tpo---------tod---------tpp---------tpk---------tnp';
K4 = '-------------------------------------------------------------------';
MAX_LN = 8; // określa ostatnie LN
LN : array[1..8] of integer = (1000,2000,4000,8000,16000,32000,64000,128000);
var
d : array[1..128000] of real; // sortowana tablica
n : integer; // liczba elementów
wmin,wmax : real; // zakres elementów
qpf,tqpc : int64; // dane dla pomiaru czasu
qpc1,qpc2 : int64;
// Tutaj umieszczamy procedurę sortującą tablicę d
//-------------------------------------------------------
function Sort : extended;
type
TElement = record
nastepnik : cardinal;
dane : real;
end;
var
L : array[1..128000] of TElement;
K : array[0..128000] of integer;
we,szkb : real;
ikb,ine,ip,ib,i,j : integer;
begin
QueryPerformanceCounter(addr(qpc1));
for i := 0 to n do K[i] := 0;
szkb := (wmax - wmin) / n;
ine := 1;
for i := 1 to n do
begin
we := d[i];
ikb := round((we - wmin) / szkb);
L[ine].nastepnik := 0; L[ine].dane := we;
ip := 0; ib := K[ikb];
while (ib > 0) and (L[ib].dane < we) do
begin
ip := ib; ib := L[ib].nastepnik;
end;
if ip = 0 then
begin
L[ine].nastepnik := ib; K[ikb] := ine
end
else if ib = 0 then
L[ip].nastepnik := ine
else
begin
L[ip].nastepnik := ine; L[ine].nastepnik := ib;
end;
inc(ine);
end;
j := 1;
for ikb := 0 to n do
begin
i := K[ikb];
while i > 0 do
begin
d[j] := L[i].dane;
inc(j); i := L[i].nastepnik;
end;
end;
QueryPerformanceCounter(addr(qpc2));
Sort := (qpc2 - qpc1 - tqpc) / qpf;
end;
// Program główny
//---------------
var
i,j,k : integer;
tpo,tod,tpp,tpk,tnp : extended;
f : Text;
begin
if QueryPerformanceFrequency(addr(qpf)) then
begin
QueryPerformanceCounter(addr(qpc1));
QueryPerformanceCounter(addr(qpc2));
tqpc := qpc2 - qpc1;
assignfile(f,'wyniki.txt'); rewrite(f);
// Wydruk na ekran
writeln('Nazwa: ',NAZWA);
writeln(K1);
writeln(K2);
writeln;
writeln(K3);
// Wydruk do pliku
writeln(f,'Nazwa: ',NAZWA);
writeln(f,K1);
writeln(f,K2);
writeln(f,'');
writeln(f,K3);
for i := 1 to MAX_LN do
begin
n := LN[i];
// Czas sortowania zbioru posortowanego
wmin := 1; wmax := n;
for j := 1 to n do d[j] := j;
tpo := Sort;
// Czas sortowania zbioru posortowanego odwrotnie
for j := 1 to n do d[j] := n - j;
tod := Sort;
// Czas sortowania zbioru posortowanego
// z przypadkowym elementem na początku - średnia z 10 obiegów
tpp := 0;
for j := 1 to 10 do
begin
for k := 1 to n do d[k] := k;
d[1] := random * n + 1;
tpp += Sort;
end;
tpp /= 10;
// Czas sortowania zbioru posortowanego
// z przypadkowym elementem na końcu - średnia z 10 obiegów
tpk := 0;
for j := 1 to 10 do
begin
for k := 1 to n do d[k] := k;
d[n] := random * n + 1;
tpk += Sort;
end;
tpk /= 10;
// Czas sortowania zbioru nieuporządkowanego - średnia z 10 obiegów
tnp := 0; wmin := 0; wmax := 1;
for j := 1 to 10 do
begin
for k := 1 to n do d[k] := random;
tnp += Sort;
end;
tnp /= 10;
writeln(n:7,tpo:12:6,tod:12:6,tpp:12:6,tpk:12:6,tnp:12:6);
writeln(f,n:7,tpo:12:6,tod:12:6,tpp:12:6,tpk:12:6,tnp:12:6);
end;
writeln(K4);
writeln(f,K4);
writeln(f,'Koniec');
closefile(f);
writeln;
writeln('Koniec. Wyniki w pliku WYNIKI.TXT');
end
else writeln('Na tym komputerze program testowy nie pracuje !');
writeln;
write('Nacisnij klawisz ENTER...'); readln;
end.
|
Otrzymane wyniki są następujące (dla komputera o innych parametrach wyniki mogą się różnić co do wartości czasów wykonania, dlatego w celach porównawczych proponuję uruchomić podany program na komputerze czytelnika):
| Zawartość pliku wygenerowanego przez program | ||||||||||||||||||
Nazwa: Sortowanie kubełkowe Objaśnienia oznaczeń (wszystkie czasy podano w sekundach):
|
(Arkusz kalkulacyjny Excel do wyznaczania klasy czasowej złożoności
obliczeniowej)
(Arkusz kalkulacyjny Excel do wyznaczania wzrostu prędkości sortowania)
Analizując wyniki obliczeń w arkuszu kalkulacyjnym otrzymanych czasów sortowania dla algorytmu sortowania kubełkowego wyciągamy następujące wnioski:
| Cechy Algorytmu Sortowania Kubełkowego | |
| klasa złożoności obliczeniowej optymistyczna |
![]() |
| klasa złożoności obliczeniowej typowa | |
| klasa złożoności obliczeniowej pesymistyczna ? | |
| Sortowanie w miejscu | NIE |
| Stabilność | NIE |
Klasy złożoności obliczeniowej szacujemy następująco:
| Własności algorytmu | |||||
| Algorytm | tpo | tod | tpp | tpk | tnp |
| Sortowanie kubełkowe |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
| Wzrost prędkości sortowania | |||||
| Algorytmy | tpo | tod | tpp | tpk | tnp |
| Sortowanie przez
scalanie Sortowanie szybkie |
![]() |
![]() |
![]() |
![]() |
![]() |
| dobrze | dobrze | dobrze | dobrze | dobrze | |
Algorytm sortowania kubełkowego wykazuje logarytmiczny wzrost prędkości sortowania w stosunku do algorytmu sortowania szybkiego wraz ze wzrostem liczby elementów w sortowanym zbiorze. Musimy jednak sprawiedliwie przyznać, iż w przypadku ogólnym algorytm sortowania szybkiego był szybszy dla maksymalnej, badanej przez nas liczby elementów równej 128000. Z prostej symulacji wynika, iż algorytm sortowania kubełkowego stanie się szybszy dopiero dla około 4 milionów elementów. Zatem raczej nie stanowi on zagrożenia dla Quick Sort.
Zobacz również
na:
Sortowanie rozrzutowe | Sortowanie kubełkowe
1 | Listy | Sortowanie przez zliczanie
| Sortowanie pozycyjne
![]() |
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.