Tìm hiểu về sắp xếp mảng trong JavaScript
Javascript căn bản | by
Trong lập trình, việc sắp xếp dữ liệu đóng vai trò quan trọng giúp tổ chức, tìm kiếm và xử lý thông tin hiệu quả. JavaScript cung cấp nhiều phương pháp để sắp xếp mảng, từ các phương thức tích hợp sẵn như sort()
và reverse()
, đến các thuật toán sắp xếp nâng cao như Bubble Sort, Quick Sort, Merge Sort,... Việc hiểu và sử dụng đúng cách các phương thức sắp xếp sẽ giúp tối ưu hiệu suất chương trình, đặc biệt khi làm việc với tập dữ liệu lớn.
Trong bài viết này, mình sẽ tìm hiểu chi tiết về các phương pháp sắp xếp mảng trong JavaScript, cách sử dụng chúng và những lưu ý quan trọng khi thao tác với mảng.
Sắp xếp mảng trong JavaScript
Sắp xếp mảng (Array Sorting) là quá trình sắp xếp các phần tử trong mảng theo một thứ tự cụ thể, chẳng hạn như:
- Tăng dần (Ascending Order): Sắp xếp từ nhỏ đến lớn (1 → 2 → 3 hoặc A → B → C).
- Giảm dần (Descending Order): Sắp xếp từ lớn đến nhỏ (3 → 2 → 1 hoặc Z → Y → X).
- Sắp xếp tùy chỉnh: Dựa trên tiêu chí cụ thể (ví dụ: sắp xếp theo độ dài chuỗi, theo giá trị thuộc tính của đối tượng).
Tại sao cần sắp xếp mảng?
Việc sắp xếp mảng có vai trò quan trọng trong lập trình, giúp:
- Truy xuất dữ liệu nhanh hơn: Khi dữ liệu được sắp xếp, việc tìm kiếm và xử lý sẽ trở nên dễ dàng và hiệu quả hơn.
- Cải thiện hiển thị dữ liệu: Khi hiển thị danh sách dữ liệu như bảng xếp hạng, danh sách sản phẩm, hoặc danh sách điểm số, sắp xếp giúp dữ liệu có cấu trúc và dễ đọc hơn.
- Hỗ trợ tìm kiếm nhị phân (Binary Search): Tìm kiếm nhị phân hoạt động hiệu quả hơn trên mảng đã được sắp xếp, giúp giảm thời gian tìm kiếm từ O(n) xuống O(log n).
- Tối ưu hóa thuật toán: Một số thuật toán như tìm kiếm, lọc hoặc gom nhóm dữ liệu hoạt động nhanh hơn khi dữ liệu đã được sắp xếp.
Các phương pháp sắp xếp phổ biến trong JavaScript
JavaScript cung cấp hai cách chính để sắp xếp mảng:
Sử dụng phương thức có sẵn của JavaScript
sort()
: Phương thức này sắp xếp mảng theo thứ tự mặc định hoặc theo một điều kiện tùy chỉnh do người dùng định nghĩa.reverse()
: Đảo ngược thứ tự của mảng, thường được sử dụng sausort()
để chuyển từ sắp xếp tăng dần sang giảm dần.
Viết thuật toán sắp xếp thủ công
Khi cần kiểm soát quá trình sắp xếp hoặc tối ưu hóa hiệu suất, có thể áp dụng các thuật toán sắp xếp phổ biến:
- Bubble Sort (Sắp xếp nổi bọt): So sánh từng cặp phần tử liên tiếp và hoán đổi vị trí nếu cần.
- Selection Sort (Sắp xếp chọn): Tìm phần tử nhỏ nhất/lớn nhất và đặt vào vị trí tương ứng.
- Insertion Sort (Sắp xếp chèn): Chèn từng phần tử vào vị trí thích hợp trong danh sách đã được sắp xếp.
- Merge Sort (Sắp xếp trộn): Chia nhỏ mảng thành các phần rồi ghép lại theo thứ tự.
- Quick Sort (Sắp xếp nhanh): Chọn một phần tử làm “pivot”, sau đó chia mảng thành hai phần rồi sắp xếp đệ quy.
Mỗi thuật toán có ưu và nhược điểm riêng, tùy thuộc vào kích thước và đặc điểm của dữ liệu mà ta lựa chọn cách sắp xếp phù hợp.
Phương thức sắp xếp có sẵn trong JavaScript
JavaScript cung cấp hai phương thức chính để sắp xếp mảng: sort()
và reverse()
. Đây là những phương thức giúp lập trình viên dễ dàng sắp xếp dữ liệu mà không cần tự viết thuật toán sắp xếp thủ công.
Phương thức sort() - Sắp xếp mảng theo thứ tự mong muốn
Cách hoạt động của sort()
- Mặc định,
sort()
sắp xếp các phần tử trong mảng theo thứ tự chữ cái Unicode (dạng chuỗi). - Để sắp xếp theo số hoặc điều kiện tùy chỉnh, ta cần truyền một hàm so sánh (callback function) vào phương thức
sort()
.
Sắp xếp theo thứ tự mặc định (Unicode - dạng chuỗi)
Khi không truyền hàm so sánh, sort()
sẽ chuyển các phần tử thành chuỗi và sắp xếp theo thứ tự Unicode. Điều này có thể gây ra kết quả không mong muốn khi sắp xếp số.
Ví dụ:
let arr = [25, 3, 100, 7, 50]; arr.sort(); console.log(arr); // Kết quả: [100, 25, 3, 50, 7] (Sai mong đợi)
Giải thích:
- Do
sort()
sắp xếp theo thứ tự chuỗi, nên"100"
được xem xét trước"25"
vì"1"
nhỏ hơn"2"
. - Điều này không đúng với kiểu số, vì vậy cần truyền vào một hàm so sánh.
Sắp xếp số tăng dần và giảm dần
Để sắp xếp số đúng cách, ta truyền vào sort()
một hàm so sánh:
Tăng dần (Ascending Order):
let arr = [25, 3, 100, 7, 50]; arr.sort((a, b) => a - b); console.log(arr); // Kết quả: [3, 7, 25, 50, 100]