Javascript 如何在排序数组中插入值并保持数组排序?

Javascript 如何在排序数组中插入值并保持数组排序?,javascript,arrays,Javascript,Arrays,在数组中插入值并保持数组排序的最佳方法是什么 例如,这里有一个数组 const arr = [1, 4, 23, 45]; 我可以使用方法push或splice添加一个新值,例如16,我将得到修改后的数组: [1, 4, 23, 45, 16] 但我需要对数组进行排序: [1, 4, 16, 23, 45] 保持数组排序的更好方法是什么?我应该在每次添加新值时进行排序,还是检测插入新值所需的索引?请查看复杂性: 排序:最佳情况下的O(nlogn) 索引插入:在更糟糕的情况下为O(n) 排

在数组中插入值并保持数组排序的最佳方法是什么

例如,这里有一个数组

const arr = [1, 4, 23, 45];
我可以使用方法push或splice添加一个新值,例如16,我将得到修改后的数组:

[1, 4, 23, 45, 16]
但我需要对数组进行排序:

[1, 4, 16, 23, 45]

保持数组排序的更好方法是什么?我应该在每次添加新值时进行排序,还是检测插入新值所需的索引?

请查看复杂性:

  • 排序:最佳情况下的O(nlogn)
  • 索引插入:在更糟糕的情况下为O(n)
  • 排序智能:O(n)在最佳情况下,使用insertionSort之类的算法,当数组几乎已经排序时,这种算法工作得非常好
  • 二进制插入:O(logn)这是首选方式
函数二进制插入(arr,元素){
返回binaryHelper(arr,元素,0,arr.length-1);
}
函数binaryHelper(arr、元素、lBound、uBound){
if(uBound-lBound==1){
//二进制搜索结束后,我们需要在此处插入元素
if(元素arr[uBound])arr.splice(uBound+1,0,元素);
else阵列拼接(uBond,0,元件);
}否则{
//我们寻找中间点
常数中点=数学楼层((uBond-lBond)/2)+lBond;
/根据中间值,我们只对数组的一个部分重复操作,每次减半。
元素console.log(数组)只要看看复杂性:

  • 排序:最佳情况下的O(nlogn)
  • 索引插入:在更糟糕的情况下为O(n)
  • 排序智能:O(n)在最佳情况下,使用insertionSort之类的算法,当数组几乎已经排序时,这种算法工作得非常好
  • 二进制插入:O(logn)这是首选方式
函数二进制插入(arr,元素){
返回binaryHelper(arr,元素,0,arr.length-1);
}
函数binaryHelper(arr、元素、lBound、uBound){
if(uBound-lBound==1){
//二进制搜索结束后,我们需要在此处插入元素
if(元素arr[uBound])arr.splice(uBound+1,0,元素);
else阵列拼接(uBond,0,元件);
}否则{
//我们寻找中间点
常数中点=数学楼层((uBond-lBond)/2)+lBond;
/根据中间值,我们只对数组的一个部分重复操作,每次减半。
元素console.log(数组)识别插入位置的计算复杂度较低,检测索引并在索引中输入值是
O(n)
,而排序通常是
O(n*log(n))
。因此,在索引处插入更好。它实际上取决于数组的大小。如果相对论很小,它真的不会有什么不同。如果没有,按照别人的建议去做。代码的简单性/可读性通常比纯粹的性能更重要。确定插入位置的计算复杂度更低,检测索引并在索引中输入值是O(n),而排序通常是O(n*log(n))。因此,在索引处插入更好。它实际上取决于数组的大小。如果相对论很小,它真的不会有什么不同。如果没有,按照别人的建议去做。代码的简单性/可读性通常比纯性能更重要。智能检测应该低于O(n)-对于排序数组来说,使用二进制切块查找正确的索引是O(log(n))。@VLAZ你说得对!谢谢你指出这一点,我完全忘记了。我将它添加到答案中,并将为它添加一些代码(问题已经结束,但也许它仍然会帮助一些迷失的灵魂)。智能检测应该低于
O(n)
-对于排序数组,它是
O(log(n))
,使用二进制切块来找到正确的索引。@VLAZ你说得对!谢谢你指出这一点,我完全忘记了。我把它添加到了答案中,并将为它添加一些代码(问题已经结束,但也许它仍然会帮助一些迷失的灵魂)。