在我的复杂性敏感应用程序中,我尝试通过迭代测量按这两种方式排序所需的时间来分析Insertion sort
和Java Collections.sort()
的性能。
我使用了以下Insertion sort
逻辑
void applyInsertionSort(ArrayList<Integer> list0) {
ArrayList<Integer> list = new ArrayList<>(list0);
long startTime = System.nanoTime();
for (int i = 1; i < list.size(); i++) {
int eleToBeSorted = list.get(i);
for (int j = i; j > 0; j--) {
if (eleToBeSorted < list.get(j - 1)) {
int temp = list.get(j - 1);
list.set(j - 1, eleToBeSorted);
list.set(j, temp);
}
}
}
long elapsed = System.nanoTime() - startTime;
insSortTime.add((double) elapsed / 1000000); //Record elapsed time(Millis)
return list;
}
在另一种方法中,我使用了Collections.sort()
void applyCollectionsSort(ArrayList<Integer> list0) {
ArrayList<Integer> list = new ArrayList<>(list0);
long startTime = System.nanoTime();
Collections.sort(list);
long elapsed = System.nanoTime() - startTime;
collSortTime.add((double) elapsed / 1000000); //Record elapsed time(Millis)
return list;
}
然后我迭代地(2000次迭代)通过在每次迭代结束时对原始list
中的元素进行混洗来独立地调用这些方法。
for (int i = 0; i < iterations; i++) {
applyInsertionSort(list);
applyCollectionsSort(list);
Collections.shuffle(list);
}
我有以下问题
Collections.sort()
花了相当长的时间来排序?Collections.sort()
的性能在系列的中间部分降级,如图所示,即使根据Java doc,Collections.sort()
使用优化版本的合并排序提供保证表现为n logn
?