Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 插入时排序或复制并排序_Java_Arrays_Sorting_Arraylist_Insert - Fatal编程技术网

Java 插入时排序或复制并排序

Java 插入时排序或复制并排序,java,arrays,sorting,arraylist,insert,Java,Arrays,Sorting,Arraylist,Insert,我有一个迭代器,它给我n个元素。目前,我将它们逐个复制到ArrayList中,然后调用该列表上的Collections.Sort()以获得排序后的ArrayList。这需要nlog(n)+n次操作。是否有更快的方法来执行此操作,即是否可以在一定程度上使用插入操作 迭代器不提供任何排序,元素几乎是随机出现的。因为迭代器不是集合或容器,所以不可能像您已经注意到的那样直接在迭代器中排序。在这种情况下,您使用的方法似乎是最好的解决方案。因为迭代器不是集合或容器,所以不可能像您已经注意到的那样,直接在迭代

我有一个迭代器,它给我n个元素。目前,我将它们逐个复制到ArrayList中,然后调用该列表上的Collections.Sort()以获得排序后的ArrayList。这需要nlog(n)+n次操作。是否有更快的方法来执行此操作,即是否可以在一定程度上使用插入操作


迭代器不提供任何排序,元素几乎是随机出现的。

因为迭代器不是集合或容器,所以不可能像您已经注意到的那样直接在迭代器中排序。在这种情况下,您使用的方法似乎是最好的解决方案。

因为迭代器不是集合或容器,所以不可能像您已经注意到的那样,直接在迭代器中排序。在这种情况下,您使用的方法似乎是最好的解决方案。

如果您的元素是唯一的,您可以将它们放到树集中,然后将它们从树集中复制到ArrayList中。这可能并不比你已经在做的更快

除此之外,你不太可能比你已经拥有的更好。编写自己的插入排序几乎肯定比只使用高度优化的Java排序例程要慢

可以考虑在java 8中查看新的java流API。这将允许您以流的形式打开迭代器,对其进行排序,然后将其整理到最终集合


如果元素是唯一的,可以将它们放入树集中,然后将它们从树集中复制到ArrayList中。这可能并不比你已经在做的更快

除此之外,你不太可能比你已经拥有的更好。编写自己的插入排序几乎肯定比只使用高度优化的Java排序例程要慢

可以考虑在java 8中查看新的java流API。这将允许您以流的形式打开迭代器,对其进行排序,然后将其整理到最终集合


如果只有迭代器,我看不到更快的解决方案。请注意,
nlogn+n
也是
O(nlogn)

如果你想“插入时排序”,你需要在每次插入时进行二进制搜索,它也是
O(nlogn)
。我不认为它会比你拥有的快很多


TreeSet可以将您从二进制搜索实现中解救出来,但基本上是相同的逻辑。

如果您只有该迭代器,我看不到更快的解决方案。请注意,
nlogn+n
也是
O(nlogn)

如果你想“插入时排序”,你需要在每次插入时进行二进制搜索,它也是
O(nlogn)
。我不认为它会比你拥有的快很多


TreeSet可以将您从二进制搜索实现中解救出来,但基本上是相同的逻辑。

如果数组中有对象而不是原始数据类型(如int、double),则必须考虑对象副本的成本。在这种情况下,对数组索引进行排序可能是更好的方法。只有在需要同时进行排序和插入时,使用搜索数据结构映射/集才更好。

如果数组中有对象而不是原始数据类型(如int、double),则必须考虑对象副本的成本。在这种情况下,对数组索引进行排序可能是更好的方法。只有当您需要同时进行排序和插入时,使用搜索数据结构映射/集才更好。

您的元素是唯一的吗?请尝试基数排序,它是
o(n+k)
。如果您的列表应该是一个有序的列表,为什么不在插入时处理它?@chieftwoils请参阅下面我对Kent答案的评论。插入ArrayList,同时保持数组中所有其他元素的有序,数组中的运行时间为O(n)。元素是否唯一?请尝试基数排序,它是
O(n+k)
。如果您的列表应该是有序列表,为什么不在插入时处理它?@chieftwoils请参阅我对Kent答案的评论。插入到ArrayList中,同时保持数组中所有其他元素的顺序,数组中的运行时为O(n)。@Kent谢谢您的回答。我不想用朗道表示法来考虑这个问题,因为nlog(n)前面的常数因子越小,在我的应用中就越好。因此,在第一个窗口使用二进制搜索执行插入排序看起来非常有希望,但由于我正在处理ArrayList,对于每个插入的元素,我可能必须移动一些O(n)元素,这将使其与我最初的方法一样快/慢。所以我现在就坚持这一点。再次感谢你和我仔细考虑。@Kent谢谢你的回答。我不想用朗道表示法来考虑这个问题,因为nlog(n)前面的常数因子越小,在我的应用中就越好。因此,在第一个窗口使用二进制搜索执行插入排序看起来非常有希望,但由于我正在处理ArrayList,对于每个插入的元素,我可能必须移动一些O(n)元素,这将使其与我最初的方法一样快/慢。所以我现在就坚持这一点。再次感谢你和我一起仔细考虑。