Java 两种选择排序方法的比较

Java 两种选择排序方法的比较,java,arrays,sorting,Java,Arrays,Sorting,这个问题类似于()但不完全是我要找的。下面是我写的一个选择排序,它是用Java编写的 public void sort() { int smallIndex; for(int i = 0; i < arr.length; i++) { smallIndex = i; for (int j = i + 1; j < arr.length; j++) { if (arr[j] < arr[smallIn

这个问题类似于()但不完全是我要找的。下面是我写的一个选择排序,它是用Java编写的

public void sort() {

    int smallIndex;

    for(int i = 0; i < arr.length; i++) {

        smallIndex = i;

        for (int j = i + 1; j < arr.length; j++) {
            if (arr[j] < arr[smallIndex]) {

                smallIndex = j;
            }
        }

        if(i < smallIndex)
            swap(i, smallIndex);
    }
}
我正在用50000个介于0和999之间的随机元素填充数组。这种方法分类很好。每次执行大约1400毫秒(1300-1500)

这是我在看的一本书中的一部分

public void sortBook() {

    for(int i = 0; i < arr.length; i++) {

        int minPos = minimumPosition(i);
        swap(minPos, i);
    }
}
publicsvoidsortbook(){
对于(int i=0;i
这是最小位置法

public int minimumPosition(int from) {

    int minPos = from;

    for(int i = from + 1; i < arr.length; i++) {

        if(arr[i] < arr[minPos]) {

            minPos = i;
        }
    }

    return minPos;
}
public int-minimumPosition(int-from){
int minPos=来自;
for(int i=from+1;i
交换方法就是我在上面使用的方法。对于50000个元素(范围为0-999),我始终得到大约700毫秒的执行时间

我的问题是,为什么sort()的执行时间几乎是sortBook()的两倍。我在较小的数组中对它们进行了详细介绍,它们似乎采取了相同数量的步骤来做相同的事情,sort()有时只交换,sortBook()每次交换。在我的新手眼里,他们看起来做的几乎完全一样


我不明白为什么sort()花费的时间大约是sortBook()的两倍。有人知道为什么会这样吗

我在代码库中看到的额外比较步骤之一是

if(i < smallIndex)
if(i

你能通过这一步看看你是否得到了同样的结果吗?

首先,没有数学上的理由认为你的速度应该比书中的慢,它们表面上是一样的。
当我把它们对垒的时候,我给你的400毫秒,给书的450毫秒。我认为这个问题来自于你的时间安排,通常变化可能是由cpu在运行时做其他事情引起的,所以我在错误分析中看到的任何差异都是分散的。即使你识别的时差几乎没有意义,在这个尺度上,它与时间上的差异无关。此外,如果效率是非常重要的,尝试实现堆排序来进行有趣的挑战,我建议在C或C++中工作,这会带来更好的性能。玩得开心

如何准确测量执行时间?创建了一个秒表类,我在排序之前启动,在排序之后停止,然后以毫秒为单位打印时间。时间是一致的,所以我很确定这些数字是正确的。你做热身了吗?您是否尝试以不同的顺序运行这些方法?我的结果是书店561ms,你自己的630。热身是什么意思?这是我的秒表类的代码,可能是错误的。尝试使用jvm选项
-Xcomp
运行这些。JVM是动态编译和优化的,因此单次运行是衡量性能的一种糟糕方法,或者更确切地说,甚至比平时更糟糕。我添加的原因是我没有每次交换位置,如果我这样做的话,看起来更像是一种冒泡排序。删除它根本不会改变执行时间。我不知道是谁否决了这个答案。我得出了同样的结论。当基准测试正确时,OP的方法比book方法稍微贵一点,当去掉
if
时,差异就消失了@Joshuavis由于数据的选择,
if
false
的可能性非常小。因此,在外循环的每一步中,您都在进行比较和交换,而书本版只进行交换(如果
if
捕获的附加交换很少),并且没有额外的比较。
if(i < smallIndex)