Napiszemy algorytm bubble sort w języku PHP. Jest to algorytm in-place, a zatem będziemy musieli przyjąć zmienną zawierającą tablicę jako referencję. Do dzieła.
Pierwsza rzecz – nasza funkcja przyjmuje tablicę jako referencję, aby można ją było modyfikować in-place:
function bubbleSort(&$a)
{
(...)
}
Druga rzecz – pętla zewnętrzna, która idzie od indeksu ostatniego do indeksu 1:
function bubbleSort(&$a)
{
for ($i = count($a) - 1; $i > 0; $i--) {
(...)
}
}
Dalej – pętla wewnętrzna idąca od indeksu 0 do aktualnego końca wskazywanego przez pętlę zewnętrzną:
function bubbleSort(&$a)
{
for ($i = count($a) - 1; $i > 0; $i--) {
for ($j = 0; $j < $i; $j++) {
(...)
}
}
}
Teraz podmianka zawsze wyrzucająca największy element na koniec:
function bubbleSort(&$a)
{
for ($i = count($a) - 1; $i > 0; $i--) {
for ($j = 0; $j < $i; $j++) {
if ($a[$j] > $a[$j + 1]) {
$temp = $a[$j];
$a[$j] = $a[$j+1];
$a[$j+1] = $temp;
}
}
}
}
Teraz jeszcze optymalizacja – jeżeli nie było żadnej podmianki pętli wewnętrznej, to lista jest już posortowana:
function bubbleSort(&$a)
{
for ($i = count($a) - 1; $i > 0; $i--) {
$swap = false;
for ($j = 0; $j < $i; $j++) {
if ($a[$j] > $a[$j + 1]) {
$temp = $a[$j];
$a[$j] = $a[$j+1];
$a[$j+1] = $temp;
$swap = true;
}
}
if (!$swap) break;
}
}
Przykład użycia:
$bs = [5, 2, 8, 9, 1];
bubbleSort($bs);
print_r($bs);
Przykład z internetu, gdzie robimy „niby bubble sort”:
function bubbleSortOptimized(array $a): array
{
for ($i = count($a) - 1; $i > 0; $i--) {
$swap = false;
for ($j = 0; $j < $i; $j++) {
if ($a[$j] > $a[$j + 1]) {
$temp = $a[$j];
$a[$j] = $a[$j+1];
$a[$j+1] = $temp;
$swap = true;
}
}
if (!$swap) break;
}
return $a;
}
//$bs = [5, 2, 8, 9, 1];
//$outcome = bubbleSort($bs);
//print_r($outcome);
Niby, ponieważ ten przykład zwraca nową tablicę, oryginalna nie zostaje zmieniona. Bubble sort działa in-place i ma zmieniać przekazaną tablicę, nie zwracać inną.
Aby to osiągnąć – przekazujemy zmienną przez referencję.