是否有更高效的方法将元素添加到排序位置的数组中?

时间:2011-06-20 20:55:29

标签: ruby

此方法只是取一个元素并将其插入已排序数组中的有序位置。

@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

3 个答案:

答案 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]