Radix Sort là một thuật toán sắp xếp dựa trên chức năng phân đoạn số. Nó sắp xếp các số dựa trên chữ số hàng đơn vị, hàng chục, hàng trăm và các chữ số khác trong mỗi số.
Radix Sort sử dụng các hàm phụ trợ như Counting Sort để thực hiện việc sắp xếp cho mỗi chữ số. Quá trình sắp xếp được thực hiện từ trái sang phải, từ chữ số hàng đơn vị đến chữ số hàng trăm. Sau khi mỗi chữ số được sắp xếp, các số sẽ được sắp xếp theo chữ số tiếp theo.
Các bài viết liên quan:
Radix Sort chỉ hoạt động với các số nguyên và các số có số chữ số cố định. Nó có độ phức tạp thời gian O(w * n) trong đó w là số chữ số trung bình trong các số và n là số phần tử trong mảng.
Ưu điểm thuật toán Radix Sort
- Hiệu suất tốt: Radix Sort có thể hoạt động nhanh hơn các thuật toán sắp xếp khác như Quick Sort hoặc Merge Sort trong một số trường hợp đặc biệt.
- Không cần so sánh: Radix Sort không cần so sánh giữa các phần tử, nó chỉ tính toán và sắp xếp các số dựa trên chữ số. Vì vậy, nó là một lựa chọn tốt cho các dữ liệu đặc biệt như số nguyên với số chữ số cố định.
- Không tùy chọn: Radix Sort là một thuật toán độc lập về dữ liệu, nó không phụ thuộc vào cấu trúc hoặc giá trị của dữ liệu.
- Dễ dàng mở rộng: Radix Sort có thể dễ dàng mở rộng để sắp xếp các dữ liệu khác nhau như chuỗi hoặc số thực.
- Dễ hiểu: Radix Sort là một thuật toán dễ hiểu với cú pháp đơn giản và cách hoạt động rõ ràng.
Ví dụ về Radix Sort trong c++
Đây là một ví dụ về thực thi Radix Sort trong C++:
#include <iostream> #include <vector> using namespace std; void radixSort(vector<int> &arr) { int max = arr[0]; // Tìm giá trị lớn nhất trong mảng for (int i = 1; i < arr.size(); i++) if (arr[i] > max) max = arr[i]; // Thực hiện sắp xếp từng chữ số for (int exp = 1; max / exp > 0; exp *= 10) { vector<int> output(arr.size()); int count[10] = {0}; // Đếm số lần xuất hiện của mỗi chữ số for (int i = 0; i < arr.size(); i++) count[(arr[i] / exp) % 10]++; // Tính tổng các số đếm for (int i = 1; i < 10; i++) count[i] += count[i - 1]; // Chuyển vị trí các phần tử trong mảng đầu ra for (int i = arr.size() - 1; i >= 0; i--) { output[count[(arr[i] / exp) % 10] - 1] = arr[i]; count[(arr[i] / exp) % 10]--; } // Gán mảng đầu ra vào mảng ban đầu for (int i = 0; i < arr.size(); i++) arr[i] = output[i]; } } int main() { vector<int> arr = {170, 45, 75, 90, 802, 24, 2, 66}; radixSort(arr); cout << "Sorted array is:\n"; for (int i = 0; i < arr.size(); i++) cout << arr[i] << " "; return 0; }
Giải thích đoạn code trên
Đoạn code trên là một ví dụ về thực hiện Radix Sort trong C++.
Trong đoạn code này, chúng ta có một hàm radixSort
nhận một vector arr
làm đối số để sắp xếp.
Trong hàm radixSort
, chúng ta tìm giá trị lớn nhất trong mảng bằng cách duyệt qua tất cả các phần tử trong mảng và lưu giá trị lớn nhất vào biến max
.
Sau đó, chúng ta sẽ thực hiện việc sắp xếp từng chữ số của các số trong mảng bằng cách sử dụng vòng lặp for và exp
là một biến lưu giá trị mũ của 10. Vòng lặp sẽ tiếp tục cho đến khi giá trị max / exp
<= 0.
Trong mỗi vòng lặp, chúng ta sẽ tạo ra một mảng output
có kích thước bằng với kích thước của mảng ban đầu, và một mảng count
có 10 phần tử để đếm số lần xuất hiện của mỗi chữ số.
Sau đó, chúng ta sẽ duyệt qua tất cả các phần tử trong mảng ban đầu và tăng giá trị tại vị trí tương ứng trong mảng count
lên 1 để đếm số lần xuất hiện của mỗi chữ số.
Các câu hỏi phổ biến về radix sort
- Radix sort là gì?
- Radix sort là một thuật toán sắp xếp dựa trên cơ số. Nó được sử dụng để sắp xếp các phần tử trong một danh sách dựa trên các chữ số trong các giá trị của chúng.
- Cách thức hoạt động của radix sort là gì?
- Radix sort hoạt động bằng cách sắp xếp danh sách các số theo từng chữ số, bắt đầu từ chữ số thấp nhất và kết thúc ở chữ số cao nhất. Thuật toán sử dụng một số lượng hữu hạn các bucket để phân loại các số vào các bucket tương ứng với các giá trị của chữ số tương ứng. Sau đó, các phần tử trong các bucket được sắp xếp lại để tạo thành danh sách mới, và quá trình được lặp lại cho đến khi tất cả các chữ số của các phần tử trong danh sách đã được sắp xếp.
- Radix sort là một thuật toán sắp xếp ổn định hay không?
- Radix sort là một thuật toán sắp xếp ổn định. Điều này có nghĩa là các phần tử có cùng giá trị trong danh sách sẽ không bị thay đổi thứ tự sau khi sắp xếp.
- Radix sort có độ phức tạp thời gian là bao nhiêu?
- Độ phức tạp thời gian của radix sort là O(kn), trong đó k là số lượng chữ số của phần tử lớn nhất trong danh sách và n là kích thước của danh sách.
- Radix sort có độ phức tạp không gian là bao nhiêu?
- Độ phức tạp không gian của radix sort là O(n+k), trong đó n là kích thước của danh sách và k là số lượng chữ số của phần tử lớn nhất trong danh sách.
- Radix sort có ưu điểm gì so với các thuật toán sắp xếp khác?
- Radix sort có một số ưu điểm so với các thuật toán sắp xếp khác:
- Không phụ thuộc vào so sánh, do đó độ phức tạp thời gian của nó có thể tốt hơn so với các thuật toán sắp xếp dựa trên so sánh.
- Độ phức tạp thời gian của radix sort là độc lập với kích thước của giá trị đầu vào, do đó nó có thể được sử dụng để sắp xếp các danh sách có kích thước lớn.
- Radix sort cũng là một trong những thuật toán sắp xếp được sử dụng nhiều trong các ứng dụng thực tế, như khi sắp xếp các số nguyên lớn trong khoảng từ 1 đến một triệu hoặc khi sắp xếp các chuỗi ký tự theo thứ tự từ điển.
- Radix sort có nhược điểm gì?
- Một trong những nhược điểm của radix sort là nó yêu cầu một số lượng bộ nhớ đáng kể để lưu trữ các bucket trong quá trình phân loại các phần tử. Nếu danh sách đầu vào rất lớn và số lượng chữ số của phần tử lớn nhất trong danh sách cũng lớn, điều này có thể dẫn đến việc sử dụng bộ nhớ quá nhiều và dẫn đến các vấn đề hiệu suất.
- Một nhược điểm khác của radix sort là nó chỉ có thể sắp xếp các loại dữ liệu có thể biểu diễn bằng các hệ số cơ số, chẳng hạn như các số nguyên hoặc các chuỗi ký tự có thể được biểu diễn bằng ASCII hoặc Unicode. Các loại dữ liệu khác, chẳng hạn như các số thực, không thể được sắp xếp bằng radix sort mà phải sử dụng các thuật toán khác.
- Có bao nhiêu loại radix sort?
- Có hai loại radix sort là LSD (Least Significant Digit) radix sort và MSD (Most Significant Digit) radix sort. LSD radix sort sắp xếp các phần tử từ chữ số thấp nhất đến chữ số cao nhất, trong khi MSD radix sort sắp xếp các phần tử từ chữ số cao nhất đến chữ số thấp nhất.