Radix Sort là một thuật toán sắp xếp không so sánh, hoạt động bằng cách sắp xếp các số theo từng chữ số, bắt đầu từ chữ số ít quan trọng nhất (least significant digit - LSD) đến chữ số quan trọng nhất (most significant digit - MSD). Thuật toán này thường được kết hợp với Counting Sort để sắp xếp các chữ số.
Mã Nguồn:
function getMax(arr) {
let max = arr[0];
for (let i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
function countingSort(arr, exp) {
let n = arr.length;
let output = new Array(n);
let count = new Array(10).fill(0);
// Đếm số lần xuất hiện của các chữ số
for (let i = 0; i < n; i++) {
let index = Math.floor(arr[i] / exp) % 10;
count[index]++;
}
// Thay đổi count[i] để chứa vị trí của chữ số trong output[]
for (let i = 1; i < 10; i++) {
count[i] += count[i - 1];
}
// Xây dựng mảng output[]
for (let i = n - 1; i >= 0; i--) {
let index = Math.floor(arr[i] / exp) % 10;
output[count[index] - 1] = arr[i];
count[index]--;
}
// Sao chép mảng output[] vào arr[], để arr[] chứa các số đã sắp xếp theo chữ số hiện tại
for (let i = 0; i < n; i++) {
arr[i] = output[i];
}
}
function radixSort(arr) {
// Tìm giá trị lớn nhất để biết số chữ số tối đa
let max = getMax(arr);
// Thực hiện sắp xếp đếm cho từng chữ số
for (let exp = 1; Math.floor(max / exp) > 0; exp *= 10) {
countingSort(arr, exp);
}
}
// Ví dụ kiểm tra
let arr = [170, 45, 75, 90, 802, 24, 2, 66];
radixSort(arr);
console.log(arr); // [2, 24, 45, 66, 75, 90, 170, 802]
Giải Thích:
-
Tìm Giá Trị Lớn Nhất:
- Hàm
getMax
tìm giá trị lớn nhất trong mảng để xác định số chữ số tối đa cần sắp xếp.
- Hàm
-
Sắp Xếp Đếm Cho Mỗi Chữ Số:
- Hàm
countingSort
sắp xếp các số trong mảng theo từng chữ số, từ chữ số ít quan trọng nhất đến chữ số quan trọng nhất. - Mảng
count
được sử dụng để đếm số lần xuất hiện của các chữ số và tính toán vị trí chính xác của chúng trong mảng đầu raoutput
.
- Hàm
-
Thực Hiện Radix Sort:
- Hàm
radixSort
gọi hàmcountingSort
cho mỗi chữ số, bắt đầu từ chữ số ít quan trọng nhất và tiến dần đến chữ số quan trọng nhất.
- Hàm
Tổng Quan:
- Sắp Xếp Phân Phối (Radix Sort): Thuật toán sắp xếp không so sánh, hiệu quả khi các số có độ dài chữ số tương đối nhỏ.
- Hiệu Suất: Có độ phức tạp thời gian O(d*(n+k)), trong đó d là số chữ số, n là số lượng phần tử trong mảng, và k là cơ sở của hệ số (ví dụ: 10 cho hệ thập phân).
- Ứng Dụng: Thích hợp cho các bài toán sắp xếp với số nguyên không âm và có số chữ số giới hạn.
Ví Dụ Thực Tế:
let arr = [170, 45, 75, 90, 802, 24, 2, 66];
radixSort(arr);
console.log(arr); // [2, 24, 45, 66, 75, 90, 170, 802]
Trong ví dụ trên, mảng [170, 45, 75, 90, 802, 24, 2, 66]
được sắp xếp theo thứ tự tăng dần bằng phương pháp Radix Sort.
Comments