Menu
Coddy logo textTech

Radix sort (sortowanie pozycyjne)

Ostatnia aktualizacja

Radix sort to sortowanie bez porównań dla liczb całkowitych. Zamiast porównywać wartości, sortuje liczby cyfra po cyfrze. Wersja od najmniej znaczącej cyfry (LSD) przetwarza najpierw cyfrę jedności, potem dziesiątek, potem setek, używając w każdej pozycji stabilnego sortowania przez zliczanie. Ponieważ każdy przebieg jest stabilny, po przetworzeniu najbardziej znaczącej cyfry cała tablica jest posortowana. Kliknij odtwarzanie powyżej i zobacz, jak każdy przebieg po cyfrze zmienia kolejność słupków.

Radix sort działa w czasie O(d·(n + k)), gdzie d to liczba cyfr, a k to podstawa systemu (tutaj 10). Dla liczb całkowitych o stałej szerokości jest to w praktyce czas liniowy, który może pokonać sortowania przez porównania O(n log n), ale algorytm działa tylko na danych, które da się rozłożyć na cyfry lub klucze.

Złożoność czasowa i pamięciowa

PrzypadekZłożonośćUwagi
CzasO(d·(n + k))d cyfr, podstawa k (liniowy dla stałego d)
PamięćO(n + k)Tablica wynikowa + liczniki cyfr
StabilneTakKażdy przebieg po cyfrze to stabilne sortowanie przez zliczanie
Porównania?NieSortuje po cyfrach, a nie przez porównywanie wartości
Działa naLiczbach całkowitych/kluczachNie na dowolnych porównywalnych obiektach

Krok po kroku

KrokCo się dzieje
1Znajdź wartość maksymalną, aby wiedzieć, ile cyfr przetworzyć.
2Zacznij od najmniej znaczącej cyfry (pozycji jedności).
3Posortuj tablicę stabilnie według tej cyfry za pomocą sortowania przez zliczanie.
4Przejdź do następnej, bardziej znaczącej cyfry.
5Powtarzaj, aż wszystkie pozycje cyfr zostaną przetworzone.

Przykład krok po kroku

Sortowanie [170, 45, 75, 90, 2, 24, 66]:

PrzebiegTablicaDziałanie
Start[170, 45, 75, 90, 2, 24, 66]Maksimum to 170, więc potrzebne są trzy przebiegi po cyfrach.
Jedności[170, 90, 2, 24, 45, 75, 66]Stabilne sortowanie według cyfry jedności: 0, 0, 2, 4, 5, 5, 6.
Dziesiątki[2, 24, 45, 66, 170, 75, 90]Stabilne sortowanie według cyfry dziesiątek: 0, 2, 4, 6, 7, 7, 9 (170 pozostaje przed 75).
Setki[2, 24, 45, 66, 75, 90, 170]Stabilne sortowanie według cyfry setek; tylko 170 ma 1, więc trafia na koniec. Posortowane.

Kiedy używać sortowania pozycyjnego

Używaj, gdyUnikaj, gdy
Klucze to liczby całkowite lub napisy o stałej długości, które da się podzielić na cyfry.Musisz sortować dowolne obiekty własnym komparatorem.
Klucze mają małą, ograniczoną liczbę cyfr d, więc O(d·(n + k)) pokonuje O(n log n).Klucze są bardzo długie lub nieograniczone, przez co d jest duże, a przebiegi kosztowne.
Potrzebujesz stabilnego sortowania i stać cię na O(n + k) dodatkowej pamięci.Pamięci jest mało, a bufory O(n + k) są nie do przyjęcia.
Zakres wartości lub podstawa k są umiarkowane w stosunku do n.k jest ogromne, więc każdy przebieg sortowania przez zliczanie dominuje czas działania.

Radix Sort: kod

Przejrzysta, gotowa do uruchomienia implementacja algorytmu Radix Sort w językach: Python, JavaScript, Java, C++, C. Wybierz język, skopiuj kod albo otwórz go od razu w edytorze online Coddy.

Radix Sort: kod (Python)

Python
1def radix_sort(a):2    # Sort by each decimal digit, least significant first3    max_value = max(a)4    exp = 15    while max_value // exp > 0:6        a = sort_by_digit(a, exp)7        exp *= 108    return a9
10
11def sort_by_digit(a, exp):12    buckets = [[] for _ in range(10)]13    for value in a:14        digit = (value // exp) % 1015        buckets[digit].append(value)16    # Concatenating buckets 0..9 keeps the sort stable17    return [value for bucket in buckets for value in bucket]18
19
20nums = [170, 45, 75, 90, 802, 24, 2, 66]21print("Before:", nums)22print("After: ", radix_sort(nums))
Uruchom ten kod w edytorze Python online

Radix sort: najczęstsze pytania

Jaka jest złożoność czasowa sortowania pozycyjnego?
Radix sort ma złożoność O(d·(n + k)), gdzie d to liczba cyfr, a k to podstawa. Dla liczb całkowitych o stałej szerokości jest to w praktyce O(n), co może być szybsze od sortowań przez porównania. Zużywa O(n + k) dodatkowej pamięci.
Czy sortowanie pozycyjne jest stabilne?
Tak. LSD radix sort opiera się na stabilnym sortowaniu przez zliczanie dla każdej cyfry; to właśnie stabilność sprawia, że podejście cyfra po cyfrze daje poprawnie posortowany wynik.
Kiedy mogę użyć sortowania pozycyjnego?
Radix sort działa na danych, które da się rozłożyć na cyfry lub klucze o stałym rozmiarze, takich jak liczby całkowite czy napisy o stałej długości. Nie jest to sortowanie przez porównania ogólnego przeznaczenia, więc nie posortuje dowolnych obiektów własnym komparatorem.
Czym różni się radix sort od sortowania przez zliczanie?
Sortowanie przez zliczanie sortuje według jednego klucza w jednym przebiegu i potrzebuje tablicy liczników tak dużej jak zakres wartości, więc traci wydajność, gdy wartości są rozproszone. Radix sort stosuje sortowanie przez zliczanie cyfra po cyfrze, utrzymując małą tablicę liczników w każdym przebiegu (podstawa k), co pozwala obsłużyć duże zakresy wartości, z którymi zwykłe sortowanie przez zliczanie by sobie nie poradziło.
Dlaczego LSD radix sort zaczyna od najmniej znaczącej cyfry?
Rozpoczęcie od najmniej znaczącej cyfry pozwala każdemu stabilnemu przebiegowi zachować kolejność ustaloną przez wszystkie wcześniejsze, mniej znaczące cyfry. Gdy przetwarzana jest najbardziej znacząca cyfra, remisy na tej cyfrze są już poprawnie uporządkowane przez niższe cyfry, więc tablica kończy się w pełni posortowana. Sortowanie od najbardziej znaczącej cyfry zepsułoby to i wymagałoby innego, rekurencyjnego podejścia (MSD radix sort).
Czy sortowanie pozycyjne obsługuje liczby ujemne?
Nie bezpośrednio: podstawowe wyodrębnianie cyfr zakłada nieujemne liczby całkowite. Typowe rozwiązania to przesunięcie wszystkich wartości przez dodanie minimum, aby wszystko było nieujemne, albo osobne sortowanie liczb ujemnych i nieujemnych, a potem ich połączenie. Pominięcie tego to częsty błąd przy stosowaniu radix sort do prawdziwych danych.
Ilustracja języków programowania w Coddy

Opanuj algorytmy z Coddy

ZACZNIJ