Bubble Sort
See it animated in Zerethon Tools ↗Repeatedly swap adjacent out-of-order pairs; stop early when a pass makes no swap — O(n²).
This is an older version. The current version is 1.2.0.
Implementations
Sign in to open in IDE
Sign in with your Zerethon account to create your own copy of this sample.
Files
# Bubble Sort
Zerethon Official Sample `bubble-sort`, version 1.1.0, PHP 8.4.
- `bubble_sort.php` — the algorithm, as shown in Zerethon Tools
- `main.php` — entry file: a short demonstration
- `test_bubble_sort.php` — checks; set it as the entry file to run them
This project is your own copy. Changing it never changes the official sample.
See the algorithm animated: https://tools.zerethon.com/bubble-sort-visualizer
<?php
// Bubble Sort (Zerethon Official Sample: bubble-sort 1.1.0).
// The algorithm as shown in Zerethon Tools.
function bubble_sort(array $a): array {
$n = count($a);
for ($i = 0; $i < $n - 1; $i++) {
$swapped = false;
for ($j = 0; $j < $n - 1 - $i; $j++) {
if ($a[$j] > $a[$j + 1]) {
[$a[$j], $a[$j + 1]] = [$a[$j + 1], $a[$j]];
$swapped = true;
}
}
if (!$swapped) break; // already sorted
}
return $a;
}
<?php
require __DIR__ . '/bubble_sort.php';
$a = [38, 27, 43, 3, 9, 82, 10, 27];
echo 'Before: [' . implode(', ', $a) . "]\n";
$result = bubble_sort($a);
echo 'After: [' . implode(', ', $result) . "]\n";
$expected = $a;
sort($expected);
echo 'Same as sort(): ' . ($result === $expected ? 'true' : 'false') . "\n";
<?php
// Checks for bubble_sort. To run them, set this file as the entry file
// (the ▶ button next to it in Files) and press Run.
require __DIR__ . '/bubble_sort.php';
/** Deterministic pseudo-random integers in [-50, 49] (the same as the Python checks). */
function numbers(int $seed, int $count): array
{
$out = [];
for ($i = 0; $i < $count; $i++) {
$seed = ($seed * 1103515245 + 12345) % 2 ** 31;
$out[] = $seed % 100 - 50;
}
return $out;
}
$cases = [[], [1], [2, 1], [1, 2, 3], [3, 2, 1], [5, 1, 5, 1, 5], [-3, 0, -1, 2]];
foreach ([[1, 10], [2, 50], [3, 200]] as [$seed, $size]) {
$cases[] = numbers($seed, $size);
}
foreach ($cases as $a) {
$result = bubble_sort($a);
$expected = $a;
sort($expected);
if ($result !== $expected) {
fwrite(STDERR, 'bubble_sort([' . implode(', ', array_slice($a, 0, 6)) . "...]) is wrong\n");
exit(1);
}
}
echo 'All ' . count($cases) . " checks passed.\n";
Source: Zerethon Official Sample. Algorithm as shown in the Zerethon Tools Bubble Sort Visualizer.