Saya memiliki array JavaScript yang diurutkan, dan ingin memasukkan satu item lagi ke dalam array sehingga array yang dihasilkan tetap diurutkan. Saya pasti bisa menerapkan fungsi penyisipan quicksort-style sederhana:
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));
[PERINGATAN] kode ini memiliki bug ketika mencoba memasukkan ke awal array, misalnya insert(2, [3, 7 ,9]
) menghasilkan salah [3, 2, 7, 9].
Namun, saya perhatikan bahwa implementasi fungsi Array.sort berpotensi melakukan ini untuk saya, dan secara native:
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));
Apakah ada alasan bagus untuk memilih implementasi pertama dari yang kedua?
Sunting : Perhatikan bahwa untuk kasus umum, penyisipan O (log (n)) (seperti yang diterapkan pada contoh pertama) akan lebih cepat daripada algoritma penyortiran umum; namun ini belum tentu berlaku untuk JavaScript pada khususnya. Perhatikan bahwa:
- Kasus terbaik untuk beberapa algoritma penyisipan adalah O (n), yang masih sangat berbeda dari O (log (n)), tetapi tidak seburuk O (n log (n)) seperti yang disebutkan di bawah ini. Itu akan datang ke algoritma pengurutan tertentu yang digunakan (lihat implementasi Javascript Array.sort? )
- Metode pengurutan dalam JavaScript adalah fungsi asli, sehingga berpotensi menyadari manfaat besar - O (log (n)) dengan koefisien yang sangat besar masih bisa jauh lebih buruk daripada O (n) untuk set data berukuran cukup.
splice()
(mis. Contoh pertama Anda) sudah O (n). Bahkan jika itu tidak secara internal membuat salinan baru dari seluruh array, itu berpotensi harus shunt semua item n kembali posisi 1 jika elemen yang akan dimasukkan di posisi 0. Mungkin itu cepat karena itu adalah fungsi asli dan konstanta adalah rendah, tapi tetap saja O (n).
parseInt
gunakan Math.floor
sebagai gantinya. Math.floor
jauh lebih cepat daripada parseInt
: jsperf.com/test-parseint-and-math-floor