此方法只是取一个元素并将其插入已排序数组中的有序位置。
@ary = [9,7,3,1]
insert_in_order(5)
@ary = [9,7,5,3,1]
我已经确定这比仅仅推送数组上的值并运行排序更快!在以后。但似乎这种情况正在采取比应有的步骤更多的步骤。有更高效,更有效的方法吗?
def insert_in_order val
@val = val
@ary.each_with_index{|v,i|
if @val > v
@found_index = i
break
end
}
@found_index ? @ary.insert(@found_index, @val) : @ary.push(@val)
end
答案 0 :(得分:3)
即使使用二元搜索,正如@Adithya Surampudi所说,这将是非常缓慢的。由于数组中的元素按定义位于连续的内存位置,因此在 i 最后位置插入数组时,需要将 i 元素移动到一个位置正确的,以便为新元素腾出空间。您可能需要考虑不同的数据结构,例如红黑树(如果您感觉幸运,则可以使用常规二进制搜索树)。
答案 1 :(得分:2)
执行二进制搜索并找到此元素所属的索引,然后在该索引处插入。查找索引将采用O(log(n))并且仅在保证当前列表已排序时才有效
答案 2 :(得分:1)
它并不比你现在的表现更好,但我认为它读得很好,恕我直言,你知道你的应用程序中存在瓶颈,直到你知道恕我直言:
>> ary = [9,7,3,1] #=> [9, 7, 3, 1]
>> val = 5 #=> 5
>> bigger, smaller = ary.partition{|x| x >= val} #=> [[9, 7], [3, 1]]
>> [*bigger, val, *smaller] #=> [9, 7, 5, 3, 1]