Anh em lập trình viên chắc không xa lạ gì với các thuật toán sắp xếp như Bubble Sort, Selection Sort, Quick Sort,… hầu hết các thuật toán sắp xếp cơ bản đều dựa trên việc so sánh (based sorting). Trong khoa học máy tính, có rất nhiều thuật toán sắp xếp khác nhau mà không dựa trên việc so sánh giá trị trực tiếp của các phần tử, hôm nay chúng ta cùng tìm hiểu một thuật toán sắp xếp thuộc dạng sắp xếp theo cơ số là Radix Sort và cách triển khai nó trong ngôn ngữ lập trình Javascript nhé.
Thuật toán Radix Sort
Nội dung thuật toán
Để hiểu được nội dung thuật toán, chúng ta cùng thực hiện sắp xếp mảng số sau bằng thuật toán Radix Sort (các số được biểu diễn trong hệ thập phân).
[48, 618, 836, 992 ,22, 215, 1995, 1239]
Với mỗi số trong hệ thập phân chúng ta có giá trị chữ số của từng hàng dựa theo vị trí, ví dụ 1293 thì 3 là hàng đơn vị, 9 là hàng chục, 2 là hàng trăm và 1 là hàng nghìn, … Với những số có ít chữ số hơn thì các hàng sau được hiểu có chữ số là 0, ví dụ 48 sẽ có chữ số hàng trăm và hàng nghìn đều là 0. Một cách khác chúng ta có thể biểu mảng số trên theo dạng dưới đây để tất cả các phần tử đều có cùng 4 chữ số.
[0048, 0618, 0836, 0992 ,0022, 0215, 1995, 1239]
Đầu tiên hãy chú ý vào các chữ số ở Hàng Đơn Vị, chúng ta sẽ có thể chia các phần tử trên thành các nhóm tương ứng:
- [0992, 0022] => nhóm có chữ số tận cùng là 2
- [0215, 1995] => 5
- [0836] => 6
- [0048, 0618] => 8
- [1239] => 9
Sau khi chia nhóm theo hàng đơn vị, thứ tự các phần tử trong mảng sẽ như sau:
[0992, 0022, 0215, 1995, 0836, 0048, 0618, 1239]
Lưu ý ở đây là việc chia nhóm phải giữ nguyên vị trí của các số trong nhóm theo mảng đầu vào. Ví dụ trong nhóm 2, số 0992 phải nằm trước số 0022 theo như ban đầu trong mảng cũ.
Đến đây chúng ta thực hiện lặp lại thao tác trên với lần lượt từ hàng chục, hàng trăm và hàng nghìn. Kết quả từng bước sẽ như dưới đây:
Với Hàng chục, ta có các nhóm:
- [0618, 0215] => nhóm có chữ số hàng chục là 1
- [0022] => nhóm 2
- [0836, 1239] => nhóm 3
- [0048] => nhóm 4
- [0992, 1995] => nhóm 9
Mảng sau khi sắp xếp:
[0618, 0215, 0022, 0836, 1239, 0048, 0992, 1995]
Với Hàng Trăm, ta có các nhóm:
- [0022, 0048] => nhóm có chữ số hàng trăm là 0
- [0215, 1239] => nhóm 2
- [0618] => nhóm 6
- [0836] => nhóm 8
- [0992, 1995] => nhóm 9
Mảng sau khi sắp xếp:
[0022, 0048, 0215, 1239, 0618, 0836, 0992, 1995]
Cuối cùng với Hàng Nghìn, ta có các nhóm:
- [0022, 0048, 0215, 0618, 0836, 0992] => nhóm có chữ số hàng nghìn là 0
- [1239, 1995] => nhóm 1
Mảng sau khi sắp xếp:
[0022, 0048, 0215, 0618, 0836, 0992, 1239, 1995]
Hay kết quả của mảng sau khi sắp xếp thành công sẽ là:
[22, 48, 215, 618, 836, 992, 1239, 1995]
Thuật toán Radix Sort có thể dễ dàng áp dụng tương tự trong các hệ cơ số khác, dưới đây là một ví dụ trong hệ nhị phân
Triển khai thuật toán với JavaScript
Để thực hiện việc sắp xếp, trước tiên chúng ta có 1 số function bổ trợ cho việc tính toán gồm:
nhomTungHang: function thực hiện việc chia nhóm theo từng đơn vị hàng
laySoHang: function lấy số hàng theo phần tử lớn nhất của mảng
//array: mảng đầu vào function laySoHang(array) { Math.floor(Math.log10(Math.max(...array))) + 1; }
Triển khai phần sắp xếp
Xem việc làm javascript đãi ngộ tốt trên TopDev
Độ phức tạp của thuật toán
Với 1 mảng có n phần tử, trong đó phần tử lớn nhất có k chữ số, khi đó
- Số vòng lặp thực hiện sẽ là k lần
- Trong mỗi vòng lặp, các phần tử sẽ chỉ được xét đến đúng 1 lần
Kết bài
Như vậy là chúng ta đã cùng nhau tìm hiểu thuật toán sắp xếp Radix Sort và cách triển khai thuật toán này trong ngôn ngữ lập trình JavaScript. Bạn có thể cải tiến source code trên cho việc sắp xếp mảng string hay kiểu dữ liệu khác mà bạn mong muốn. Hy vọng bài viết hữu ích dành cho bạn và hẹn gặp lại trong các bài viết tiếp theo của mình.
Tác giả: Phạm Minh Khoa
Có thể bạn quan tâm:
- Thuật toán Gradient Descent
- 10 thuật toán hàng đầu dành cho lập trình viên
- Ứng dụng thuật toán và cấu trúc dữ liệu lúc đi làm
Hàng loạt việc làm IT hấp dẫn trên TopDev đang chờ bạn ứng tuyển.