首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一种更好的方法将元素添加到排序位置的数组中?

有没有一种更好的方法将元素添加到排序位置的数组中?
EN

Stack Overflow用户
提问于 2011-06-21 04:55:29
回答 3查看 110关注 0票数 1

这个方法只是获取一个元素,并将其插入到已经排序的数组中的排序位置。

代码语言:javascript
复制
@ary = [9,7,3,1]
insert_in_order(5)
@ary = [9,7,5,3,1]

我已经确定这比仅仅在数组上压入值并运行排序要快!待会再说。但看起来这比它应该采取的步骤要多得多。有没有一种更高效、更高效的方法来做到这一点?

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-21 04:58:36

执行二进制搜索并找到此元素所属的索引,然后在该索引处插入。查找索引需要O(log(n)),并且只有在保证对当前列表进行排序的情况下才有效

票数 2
EN

Stack Overflow用户

发布于 2011-06-21 05:01:15

即使使用二进制搜索,正如@Adithya Surampudi建议的那样,这也将是相当慢的。由于根据定义,数组的元素位于连续的内存位置,因此在最后第i个位置插入数组时,需要将i个元素向右移动一个位置,以便为新元素腾出空间。您可能想要考虑一种不同的数据结构,比如红黑树(如果您觉得幸运的话,也可以考虑常规的二进制搜索树)。

票数 3
EN

Stack Overflow用户

发布于 2011-06-21 05:33:40

它的性能并不比你现在拥有的更好,但我认为它读起来很好,这比性能更重要,直到你确定你的应用程序中有一个瓶颈:

代码语言:javascript
复制
>> 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]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6417388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档