我写了一个快速选择排序程序,如下所示:
public static ArrayList<Integer> selectionSort(ArrayList<Integer> list) {
for (int i=0; i < list.size()-1; i++) {
int smallestElement = i;
for (int j=i+1; j < list.size(); j++) {
if (list.get(j) < list.get(smallestElement)) {
smallestElement = j;
}
}
swapPosition(list, smallestElement, i);
}
return list;
}
public static void swapPosition(ArrayList<Integer> list, int first, int second) {
Collections.swap(list, first, second);
}
在我的主程序中,我计算程序运行的时间,以毫秒为单位。我创建了一个包含1000个项目的新ArrayList,这些项目已经排序并计算出最佳案例场景时间。然后我颠倒了1000个项目的顺序,以表示必须交换所有项目时的最坏情况,但我最糟糕的情况需要花费的时间比我最好的情况由于某种原因。在最好的情况下,不需要交换任何东西。 为什么我的程序在最好的情况下花费的时间比最坏的情况要多?以下是其余的代码:
ArrayList<Integer> bestCase = new ArrayList<Integer>();
for (int i=1; i < 1001; i++) {
bestCase.add(i);
}
long startTimeBest = System.currentTimeMillis();
selectionSort(bestCase);
long endTimeBest = System.currentTimeMillis();
long totalTimeBest = endTimeBest - startTimeBest;
System.out.println("Total time of this program in the best case "
+ "scenario is: " + totalTimeBest + " millisecond(s)");
Collections.reverse(bestCase);
long startTimeWorst = System.currentTimeMillis();
selectionSort(bestCase);
long endTimeWorst = System.currentTimeMillis();
long totalTimeWorst = endTimeWorst - startTimeWorst;
System.out.println("Total time of this program in the worst case "
+ "scenario is: " + totalTimeWorst + " millisecond(s)");
最佳情况的时间是16毫秒,最坏的情况是4毫秒。这没有意义。
答案 0 :(得分:1)
除了测试技术的问题外,似乎还有另一个问题。
“然后,我改变了1000项的顺序,以表示必须交换所有项目的最坏情况,但由于某种原因,我最糟糕的情况比最好的情况花费的时间更少。在最好的情况下,什么都不应该必须互换。“
在您的程序中,执行的交换次数(swapPosition(...)
)不依赖于要排序的元素的顺序。
执行的smallestElement = j;
指令的数量取决于订单。