C++ 在保留要排序的数组的同时插入和删除数组中的元素

C++ 在保留要排序的数组的同时插入和删除数组中的元素,c++,c,sorting,priority-queue,C++,C,Sorting,Priority Queue,我想知道是否有人能帮我解决这个问题。我正在使用C/C++编程,需要执行以下操作: 我得到了一个包含浮点数的排序数组p(最大优先)。它通常有很大的尺寸。。有时保存1000万像素图像的相关值。我需要遍历数组,直到它为空。在循环中,会发生额外的处理 问题的要点是,在循环开始时,我需要从数组中移除具有最大值的元素,检查某些条件,如果它们保持不变,那么我需要将元素重新插入数组中,但要先减小它们的值。但是,我希望在重新插入后对数组进行有效排序 有人能告诉我怎么做吗?每次插入时,我都尝试过重新排序的天真方法,

我想知道是否有人能帮我解决这个问题。我正在使用C/C++编程,需要执行以下操作:

我得到了一个包含浮点数的排序数组p(最大优先)。它通常有很大的尺寸。。有时保存1000万像素图像的相关值。我需要遍历数组,直到它为空。在循环中,会发生额外的处理

问题的要点是,在循环开始时,我需要从数组中移除具有最大值的元素,检查某些条件,如果它们保持不变,那么我需要将元素重新插入数组中,但要先减小它们的值。但是,我希望在重新插入后对数组进行有效排序


有人能告诉我怎么做吗?每次插入时,我都尝试过重新排序的天真方法,但这似乎真的很浪费

您可以使用二进制搜索来确定从数组中删除更改后的值后将其插入到何处。请注意,在前面或中间的某处插入或删除也不是非常有效,因为它需要分别移动具有较高索引的所有项目。p> ISTM建议您在完成对原始数组的迭代后,将更改的项放入一个新数组并对其排序一次。如果内存是一个问题,并且您确实必须在适当的位置执行操作,请在适当的位置更改值,并且只进行一次排序


我想不出比这更好的办法了。一直对数组进行排序似乎效率很低。

更改数据结构。重复访问最大的元素,然后快速插入新值,这样您仍然可以高效地重复访问最大的元素,这是a的工作,可能是


顺便说一句,请不要谈论“C/C++”。没有这样的语言。相反,你在对你的写作风格做出模糊的暗示,其中大多数都会让有经验的程序员觉得很糟糕。

也许使用另一个临时数组会有所帮助

这样,您可以首先单独对“已更改”的元素进行排序


然后,对两个子数组进行常规合并O(n)到临时数组,并将所有内容复制回原始数组。

我将查看,因为它就是为了这样做的。

由于数组已经排序,您可以使用二进制搜索找到插入更新值的位置。C++提供了代码> STD::LoWr.Load 或。为此,C提供了代码> BSCADUSE/COD>。只需将阵列中的所有现有值向上移动一个位置,并将新值存储在新清除的位置。

如果不将删除的值减少很多,以下是一些伪代码,它们可能会正常工作:

例如,假设您正在处理数组中具有最大值的元素,并假设数组按降序排序(首先是最大值)

  • 删除
    数组[0]

  • newVal=array[0]-adjustment
    ,其中
    adjustment
    是将值减少的量

  • 现在循环,仅调整需要的值:

  • 伪代码:

    i = 0
    while (newVal < array[i]) {
      array[i] = array[i+1];
      i++;
    }
    array[i] = newVal;
    swap(array[i], array[i+1]);
    
    i=0
    while(newVal
    同样,如果您没有将删除的值(相对于数组中的值)大量减少,这可能会非常有效


    当然,通常更好的选择是使用更合适的数据结构,例如堆。

    每次都必须合并它,这比简单地重新插入相同的数据要慢。但据我所知,他需要从数组中删除具有最大值的元素,然后在减小它们的值后将它们重新插入数组。因此,所有“更改”的值将立即收到。。。这意味着只需要一次合并…是的,但合并无法在适当的位置完成,这意味着您必须触摸3N数据。用简单的移位和插入(如vector:插入),最多可以触摸到N,在这里,“代码>堆He/Cux>在C和C++中有一个更常见的含义,更详细的描述或链接会有帮助。在C++中,PrimRythyQuey就是这样的堆。谢谢快速回答。我确实查找了最大根堆和优先级队列。。但是这里有一点细微的差别,我必须将所有相等的数组值作为一个组来处理。我的意思是,我不仅要删除最大值元素,还要删除所有具有最大值的元素(如果有多个)。。我可以用堆来做这件事吗?你可以弹出max元素,然后检查堆的顶部是否有相同的值,然后反复弹出,直到不再有。我想,必须一直移动所有元素以进行插入,这几乎抵消了一开始保持排序的好处。无论哪种方式,每次都是O(N),使用
    std::lower_bound
    只会成为一个恒定的改进因素。@Karl在最坏的情况下是O(N)。根据场景的不同,如果数组包含诸如100999690858280之类的值,这可能是一个可接受的解决方案(碰巧我也想到了完全相同的事情!)。。。这些值减少了,比如说10-,这样做一点也不坏。编辑:马克的回答可能有点误导,因为它说你必须改变“所有现有的元素”。例如,在按降序排序的数组中,您只需移动大于调整值的元素,正如我在回答中提到的。优先级队列会自动执行此操作。“通常更好的选择是使用更合适的数据结构,如堆。”这似乎是重要的部分。