在特定索引处将元素插入数组

时间:2019-07-11 02:59:49

标签: arrays algorithm sorting optimization

在一次采访中,我被要求以最优化的方式在索引中插入元素。

我已经尝试过了

  /* Make room for new array element by shifting to right */
            for(i=size; i>=pos; i--)
            {
                arr[i] = arr[i-1];
            }
             arr[pos-1] = num; /* Insert new element at given position and increment size */ 
             size++;

有没有比这更好的方法了?

1 个答案:

答案 0 :(得分:0)

您可以进行以下优化:

-将迭代器放在最后一个元素的位置,并从右到左进行迭代,直到到达pos为止,并且显然保持变量last,该变量将保留最后遇到的新元素
-在每次迭代中,检查当前元素是否等于last,如果是,则跳过它,如果否,则将当前元素复制到current_index+1并将当前元素分配给变量last
-最终将新元素分配给pos

正如我们所看到的,这种方法基于这样的假设,即比较比移位便宜(即,最好不时对每个迭代和移位元素进行比较,而不是将所有元素从pos移到结束),但我不确定这个假设在什么程度上正确-考虑到移动一个元素将需要两个涉及内存的汇编操作(从内存地址到寄存器再返回到新的内存地址),而一个涉及内存的操作(从内存地址到寄存器)和一个算术运算进行比较

最糟糕的情况是彼此之间没有相等的元素-在这种情况下,我们将在每次迭代时进行比较和移位。