Heap Sort là một thuật toán sắp xếp dựa trên cấu trúc dữ liệu Heap (đống). Nó xây dựng một Heap tối đa (Max-Heap) từ mảng đầu vào, sau đó liên tục trích xuất phần tử lớn nhất từ Heap và đặt nó vào vị trí cuối cùng của mảng. Quá trình này tiếp tục cho đến khi toàn bộ mảng được sắp xếp.
Dưới đây là cách triển khai Heap Sort trong JavaScript:
function heapSort(arr) {
let n = arr.length;
// Xây dựng Max-Heap
for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {
heapify(arr, n, i);
}
// Trích xuất các phần tử từ Heap
for (let i = n - 1; i >= 0; i--) {
// Di chuyển root hiện tại đến cuối
[arr[0], arr[i]] = [arr[i], arr[0]];
// Gọi hàm heapify trên heap bị giảm
heapify(arr, i, 0);
}
return arr;
}
// Hàm heapify một cây con với root tại chỉ số i
// n là kích thước của heap
function heapify(arr, n, i) {
let largest = i; // Khởi tạo largest như root
let left = 2 * i + 1; // chỉ số con trái = 2*i + 1
let right = 2 * i + 2; // chỉ số con phải = 2*i + 2
// Nếu con trái lớn hơn root
if (left < n && arr[left] > arr[largest]) {
largest = left;
}
// Nếu con phải lớn hơn largest hiện tại
if (right < n && arr[right] > arr[largest]) {
largest = right;
}
// Nếu largest không phải là root
if (largest != i) {
[arr[i], arr[largest]] = [arr[largest], arr[i]]; // Swap
// Đệ quy heapify cây con bị ảnh hưởng
heapify(arr, n, largest);
}
}
// Ví dụ sử dụng:
let array = [12, 11, 13, 5, 6, 7];
console.log("Mảng ban đầu: " + array);
let sortedArray = heapSort(array);
console.log("Mảng sau khi sắp xếp: " + sortedArray);
Giải thích:
-
Hàm
heapSort
:- Tạo Max-Heap từ mảng đầu vào bằng cách gọi hàm
heapify
cho tất cả các nút không phải là lá bắt đầu từ giữa mảng. - Liên tục di chuyển phần tử lớn nhất (root của Heap) đến cuối mảng và giảm kích thước của Heap, sau đó gọi lại hàm
heapify
để điều chỉnh Heap.
- Tạo Max-Heap từ mảng đầu vào bằng cách gọi hàm
-
Hàm
heapify
:- Khởi tạo
largest
như là root. - Tính toán chỉ số của các nút con trái và phải.
- Nếu nút con trái lớn hơn root, đặt
largest
là con trái. - Nếu nút con phải lớn hơn
largest
hiện tại, đặtlargest
là con phải. - Nếu
largest
không phải là root, hoán đổi root vớilargest
và đệ quy gọi lại hàmheapify
cho cây con bị ảnh hưởng.
- Khởi tạo
Thời gian và không gian:
- Thời gian:
- O(n log n) trong mọi trường hợp (tốt nhất, trung bình và xấu nhất).
- Không gian:
- O(1) vì Heap Sort là thuật toán sắp xếp tại chỗ, không yêu cầu thêm bộ nhớ ngoài mảng đầu vào.
Heap Sort là một thuật toán sắp xếp hiệu quả và ổn định với thời gian thực thi O(n log n) trong tất cả các trường hợp, tuy nhiên không ổn định vì không bảo toàn thứ tự của các phần tử bằng nhau.
Comments