Tôi có một mảng JavaScript được sắp xếp và muốn chèn thêm một mục vào mảng để mảng kết quả vẫn được sắp xếp. Tôi chắc chắn có thể thực hiện một chức năng chèn kiểu quicksort đơn giản:
var array = [1,2,3,4,5,6,7,8,9];
var element = 3.5;
function insert(element, array) {
array.splice(locationOf(element, array) + 1, 0, element);
return array;
}
function locationOf(element, array, start, end) {
start = start || 0;
end = end || array.length;
var pivot = parseInt(start + (end - start) / 2, 10);
if (end-start <= 1 || array[pivot] === element) return pivot;
if (array[pivot] < element) {
return locationOf(element, array, pivot, end);
} else {
return locationOf(element, array, start, pivot);
}
}
console.log(insert(element, array));
[CẢNH BÁO] mã này có lỗi khi cố gắng chèn vào đầu mảng, ví dụ insert(2, [3, 7 ,9]
) tạo ra không chính xác [3, 2, 7, 9].
Tuy nhiên, tôi nhận thấy rằng việc triển khai hàm Array.sort có thể có khả năng thực hiện điều này cho tôi và thực chất:
var array = [1,2,3,4,5,6,7,8,9];
var element = 3.5;
function insert(element, array) {
array.push(element);
array.sort(function(a, b) {
return a - b;
});
return array;
}
console.log(insert(element, array));
Có một lý do tốt để chọn thực hiện đầu tiên so với thứ hai?
Chỉnh sửa : Lưu ý rằng đối với trường hợp chung, việc chèn O (log (n)) (như được thực hiện trong ví dụ đầu tiên) sẽ nhanh hơn thuật toán sắp xếp chung; tuy nhiên điều này không nhất thiết là trường hợp của JavaScript nói riêng. Lưu ý rằng:
- Trường hợp tốt nhất cho một số thuật toán chèn là O (n), vẫn khác biệt đáng kể so với O (log (n)), nhưng không hoàn toàn xấu như O (n log (n)) như được đề cập dưới đây. Nó sẽ đi xuống thuật toán sắp xếp cụ thể được sử dụng (xem triển khai Javascript Array.sort? )
- Phương thức sắp xếp trong JavaScript là một hàm riêng, do đó có khả năng nhận ra những lợi ích to lớn - O (log (n)) với hệ số khổng lồ vẫn có thể tệ hơn nhiều so với O (n) đối với các tập dữ liệu có kích thước hợp lý.
splice()
(ví dụ ví dụ đầu tiên của bạn) đã là O (n). Ngay cả khi nó không tạo ra một bản sao mới của toàn bộ mảng, nó có khả năng phải chuyển tất cả n mục trở lại vị trí 1 nếu phần tử được chèn vào vị trí 0. Có thể đó là nhanh vì đó là hàm gốc và hằng số là thấp, nhưng dù sao đó là O (n).
parseInt
dụng Math.floor
thay thế.Math.floor
nhanh hơn nhiều so với parseInt
: jsperf.com/test-parseint-and-math-floor