Performance 在经常进行插入排序的列表中插入项目

Performance 在经常进行插入排序的列表中插入项目,performance,list,sorting,insertion-sort,Performance,List,Sorting,Insertion Sort,我有一个经常被排序的列表。是否有一个合适的位置(除了末尾)可以添加到此列表中,以最小化插入排序必须完成的工作?插入的最佳位置应该是元素在已排序列表中所属的位置。这类似于抢先插入排序 插入的最佳位置是元素在排序列表中所属的位置。这类似于抢先插入排序 你的问题没有意义。要么列表是按插入排序的(这意味着不能按定义追加到末尾;元素仍将在其所属的位置结束。否则,列表将不会排序) 如果必须添加大量元素,那么最好的解决方案是克隆列表,添加所有元素,对新列表排序一次,然后用克隆替换第一个列表 [编辑]回复您的评

我有一个经常被排序的列表。是否有一个合适的位置(除了末尾)可以添加到此列表中,以最小化插入排序必须完成的工作?

插入的最佳位置应该是元素在已排序列表中所属的位置。这类似于抢先插入排序

插入的最佳位置是元素在排序列表中所属的位置。这类似于抢先插入排序

你的问题没有意义。要么列表是按插入排序的(这意味着不能按定义追加到末尾;元素仍将在其所属的位置结束。否则,列表将不会排序)

如果必须添加大量元素,那么最好的解决方案是克隆列表,添加所有元素,对新列表排序一次,然后用克隆替换第一个列表

[编辑]回复您的评论:在完成几个附录后,您必须对列表进行排序,然后才能进行下一次排序插入。因此,问题不在于如何使排序插入更便宜,而在于追加和排序插入之间的排序

答案是,大多数排序算法对部分排序的列表都很好。你需要问的问题是:使用了什么排序算法,它有什么属性,最重要的是,你为什么要在意

最后一个问题是,你应该在做任何优化之前衡量性能,因为你有90%的机会,除非它是基于实际数字,否则它的伤害大于帮助

回到分拣室。Java使用quicksort的一个版本对集合进行排序。快速排序将选择一个轴心元素对集合进行分区。这种选择对算法的性能至关重要。为了获得最佳性能,枢轴元素应尽可能靠近结果中间的元素。通常,快速排序使用当前分区中间的元素作为轴心元素。此外,快速排序将开始处理带有小索引的列表

因此,在末尾添加新元素可能不会提供良好的性能。它不会影响轴心元素选择,但快速排序将在检查所有已排序元素后查看新元素。在中间添加新元素将影响枢轴选择,我们不能真正判断这是否会对性能产生影响。我本能的猜测是,如果快速排序在分区中间找到排序元素,则枢转元素会更好。

这样就可以在开始时添加新元素。通过这种方式,快速排序通常会找到一个完美的轴心元素(因为列表的中间部分会被排序),它会首先选择新元素。缺点是每次插入都必须复制整个数组。有两种方法可以避免这种情况:a)今天的PC几乎不需要任何时间就可以复制大量RAM,因此您可以忽略这一小小的性能损失。b) 您可以使用第二个ArrayList,将所有新元素放入其中,然后使用
addAll()
。Java将对这种情况进行一些内部优化,只需移动现有元素一次


我完全误解了你的问题。对于算法来说,最好的位置可能是在中间的某个地方。这将使您在整个列表中移动元素的机会减少一半。但由于我不是100%确定,我建议创建几个小测试来验证这一点。

你的问题没有意义。要么列表是按插入排序的(这意味着不能按定义追加到末尾;元素仍将在其所属的位置结束。否则,列表将不会排序)

如果必须添加大量元素,那么最好的解决方案是克隆列表,添加所有元素,对新列表排序一次,然后用克隆替换第一个列表

[编辑]回复您的评论:在完成几个附录后,您必须对列表进行排序,然后才能进行下一次排序插入。因此,问题不在于如何使排序插入更便宜,而在于追加和排序插入之间的排序

答案是,大多数排序算法对部分排序的列表都很好。你需要问的问题是:使用了什么排序算法,它有什么属性,最重要的是,你为什么要在意

最后一个问题是,你应该在做任何优化之前衡量性能,因为你有90%的机会,除非它是基于实际数字,否则它的伤害大于帮助

回到分拣室。Java使用quicksort的一个版本对集合进行排序。快速排序将选择一个轴心元素对集合进行分区。这种选择对算法的性能至关重要。为了获得最佳性能,枢轴元素应尽可能靠近结果中间的元素。通常,快速排序使用当前分区中间的元素作为轴心元素。此外,快速排序将开始处理带有小索引的列表

因此,在末尾添加新元素可能不会提供良好的性能。它不会影响轴心元素选择,但快速排序将在检查所有已排序元素后查看新元素。在中间添加新元素将影响枢轴选择,我们不能真正判断这是否会对性能产生影响。我本能的猜测是,如果快速排序在分区中间找到排序元素,则枢转元素会更好。

这样就可以在开始时添加新元素。通过这种方式,快速排序通常会找到一个完美的轴心元素(因为列表的中间部分会被排序),它会首先选择新元素。缺点是每次插入都必须复制整个数组。那里