您在这里要小心。您已选择使用一种算法来增量构建排序的数据结构,以便(我接受)您可以显示进度条。但是,这样做时,您选择的排序方法 可能
比最佳排序慢得多。(两种类型都可以,
O(NlogN)但是性能要比big-O行为更多…)
如果您担心这可能是个问题,请比较使用
TreeMap和对典型集合进行排序的时间
Collections.sort。后者的工作方式是将输入集合复制到数组中,对数组进行排序,然后再将其复制回。(它的工作原理最好的,如果在输入集合是一个ArrayList,如果你不需要结果作为可变集合就可以避免使用最终拷贝过来的
Collection.toArray,
Arrays.sort并
Arrays.asList代替。)
一种替代方法是使用Comparator对象,该对象跟踪被调用的次数,并使用该对象跟踪排序的进度。您可以利用以下事实:比较器通常会被粗略调用
N*log(N),尽管您可能需要根据实际使用的算法1对其进行校准。
顺便说一下,与对插入次数进行计数相比,对比较器的调用进行计数可以更好地指示进度。当您接近完成排序时,您将不会看到进度出现放缓的趋势。
(您将拥有不同的线程来读取和写入计数器,因此您需要考虑同步。声明计数器
volatile可以正常工作,但会增加内存流量。如果您对进度条感到满意,也可以忽略该问题有时会显示过时的值…具体取决于您的平台等)
1-这有问题。在某些算法中,比较次数可能会根据要排序的数据的初始顺序而急剧变化。对于这种算法,没有办法校准将在“非平均”情况下工作的计数器。



