Sortowanie to jedno z najważniejszych zagadnień w programowaniu. W JavaScript mamy wbudowaną metodę sort(), ale warto znać też klasyczne algorytmy sortowania, takie jak sortowanie bąbelkowe, quick sort czy merge sort.
1. Wbudowana metoda Array.sort()
Każda tablica w JavaScript ma metodę sort().
Podstawowe użycie
const liczby = [4, 2, 10, 1];
liczby.sort();
console.log(liczby); // [1, 10, 2, 4] ❌ (alfabetycznie!)
Domyślnie sortowanie odbywa się jak tekst, dlatego wyniki mogą być zaskakujące.
Sortowanie liczbowe
const liczby = [4, 2, 10, 1];
liczby.sort((a, b) => a - b);
console.log(liczby); // [1, 2, 4, 10]
Funkcja porównująca zwraca:
wartość ujemną →
aprzedb,0 → bez zmian,
wartość dodatnią →
bprzeda.
2. Sortowanie bąbelkowe (Bubble Sort)
Najprostszy do zrozumienia algorytm. Porównuje sąsiednie elementy i zamienia je miejscami, jeśli są w złej kolejności. Proces powtarza się aż do posortowania.
Kod:
function bubbleSort(arr) {
const n = arr.length;
for (let i = 0; i < n - 1; i++) {
for (let j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]; // zamiana
}
}
}
return arr;
}
console.log(bubbleSort([5, 2, 9, 1, 5, 6]));
// [1, 2, 5, 5, 6, 9]
Złożoność:
Średnia i najgorsza: O(n²)
Najlepsza (dla posortowanej tablicy z optymalizacją): O(n)
3. Sortowanie szybkie
(Quick Sort)
Jeden z najszybszych algorytmów sortowania.
Działa na zasadzie „dziel i zwyciężaj”:
Wybiera element pivot (np. środkowy).
Dzieli tablicę na mniejsze (mniejsze od pivot i większe od pivot).
Rekurencyjnie sortuje podtablice.
Kod:
function quickSort(arr) {
if (arr.length <= 1) return arr;
const pivot = arr[arr.length - 1];
const left = [];
const right = [];
for (let i = 0; i < arr.length - 1; i++) {
if (arr[i] < pivot) left.push(arr[i]);
else right.push(arr[i]);
}
return [...quickSort(left), pivot, ...quickSort(right)];
}
console.log(quickSort([10, 7, 8, 9, 1, 5]));
// [1, 5, 7, 8, 9, 10]
Złożoność:
Średnia: O(n log n)
Najgorsza (źle dobrany pivot): O(n²)
4. Sortowanie przez scalanie
(Merge Sort)
Algorytm stabilny i przewidywalny.
Dzieli tablicę na pół, aż zostaną jednoelementowe tablice.
Scala je w jedną posortowaną.
Kod:
function merge(left, right) {
let result = [];
let i = 0, j = 0;
while (i < left.length && j < right.length) {
if (left[i] < right[j]) result.push(left[i++]);
else result.push(right[j++]);
}
return [...result, ...left.slice(i), ...right.slice(j)];
}
function mergeSort(arr) {
if (arr.length <= 1) return arr;
const mid = Math.floor(arr.length / 2);
const left = mergeSort(arr.slice(0, mid));
const right = mergeSort(arr.slice(mid));
return merge(left, right);
}
console.log(mergeSort([12, 11, 13, 5, 6, 7]));
// [5, 6, 7, 11, 12, 13]
Złożoność:
Wszystkie przypadki: O(n log n)
Minusem jest dodatkowa pamięć.
5. Inne popularne algorytmy sortowania
Sortowanie przez wstawianie (Insertion Sort) – dobre dla małych tablic lub prawie posortowanych, O(n²).
Sortowanie przez wybór (Selection Sort) – proste, ale powolne, O(n²).
Heap Sort – używa kopca, O(n log n), mniej popularny w JS.
Podsumowanie
Array.sort()– najszybszy w praktyce, bo implementowany w C++ w silniku JS (np. V8).Bubble Sort – edukacyjny, prosty, ale nieefektywny.
Quick Sort – bardzo szybki dla dużych zbiorów.
Merge Sort – stabilny i przewidywalny, kosztem dodatkowej pamięci.
