ฉันมีอาร์เรย์ JavaScript ที่เรียงลำดับแล้วและต้องการแทรกอีกหนึ่งรายการลงในอาร์เรย์ดังนั้นอาร์เรย์ที่ได้จะยังคงเรียงลำดับอยู่ แน่นอนฉันสามารถใช้ฟังก์ชั่นการแทรกสไตล์ quicksort ง่าย ๆ :
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));
[คำเตือน] รหัสนี้มีข้อผิดพลาดเมื่อพยายามที่จะแทรกไปยังจุดเริ่มต้นของอาร์เรย์เช่นinsert(2, [3, 7 ,9]
) ผลิตไม่ถูกต้อง [3, 2, 7, 9]
อย่างไรก็ตามฉันสังเกตเห็นว่าการใช้งานของฟังก์ชั่น Array.sort อาจทำสิ่งนี้สำหรับฉันและโดยพื้นฐาน:
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));
มีเหตุผลที่ดีในการเลือกการใช้งานครั้งแรกในช่วงที่สองหรือไม่?
แก้ไข : โปรดทราบว่าสำหรับกรณีทั่วไปการแทรก O (บันทึก (n)) (ตามที่นำมาใช้ในตัวอย่างแรก) จะเร็วกว่าอัลกอริทึมการเรียงลำดับทั่วไป อย่างไรก็ตามนี่ไม่จำเป็นว่าในกรณีของ JavaScript โดยเฉพาะ โปรดทราบว่า:
- กรณีที่ดีที่สุดสำหรับอัลกอริธึมการแทรกหลายตัวคือ O (n) ซึ่งยังคงแตกต่างอย่างมีนัยสำคัญจาก O (log (n)) แต่ก็ไม่เลวเท่า O (n log (n)) ดังที่กล่าวไว้ด้านล่าง มันจะลงมาที่อัลกอริทึมการเรียงลำดับเฉพาะที่ใช้ (ดูการใช้Javascript Array.sort หรือไม่ )
- วิธีการเรียงลำดับใน JavaScript เป็นฟังก์ชั่นพื้นฐานดังนั้นการตระหนักถึงประโยชน์ที่ยิ่งใหญ่ - O (log (n)) ที่มีค่าสัมประสิทธิ์มหาศาลยังคงแย่กว่า O (n) สำหรับชุดข้อมูลที่มีขนาดพอสมควร
splice()
(เช่นตัวอย่างที่ 1 ของคุณ) เป็น O (n) แล้ว แม้ว่ามันจะไม่ได้สร้างสำเนาทั้งหมดของอาเรย์ใหม่ทั้งหมดภายในมันก็อาจจะต้องแบ่งไอเท็ม n ทั้งหมดกลับเป็น 1 ตำแหน่งถ้าองค์ประกอบจะถูกแทรกในตำแหน่งที่ 0 บางทีมันอาจจะเร็วเพราะมันเป็นฟังก์ชั่นพื้นฐานและค่าคงที่ ต่ำ แต่ O (n) ยังคงอยู่