java - 为什么这种时间复杂度较小的排序算法耗时较长?(已编辑)
问题描述
我写了两个几乎相同的最简单的排序算法,但是要执行一半以上操作的排序算法需要双倍的时间。我无法理解为什么会这样。
任何指针都将不胜感激,因为我试图理解最有效的排序方式,考虑到不同的情况,这种简单的排序让我感到困惑。
public class Sort{
static long timerStart;
static long timerEnd;
static long passedTime;
public static void main(String[] args) {
double[] arr = createDoubleArray(10000);
double[] arr2 = Arrays.copyOf(arr,arr.length);
startTimer();
sortDoubleArrayFast(arr);
stopTimer();
computationTime();
startTimer();
sortDoubleArraySlow(arr2);
stopTimer();
computationTime();
}
public static void startTimer(){
timerStart = System.currentTimeMillis();
}
public static void stopTimer(){
timerEnd = System.currentTimeMillis();
}
public static void computationTime(){
passedTime = timerEnd-timerStart;
System.out.println("The operations took: " +passedTime+"ms");
}
public static double[] createDoubleArray(int size){
double[] output = new double[size];
for (int i = 0; i < size; i++) {
output[i] = Math.random()*10000000;
}
return output;
}
public static double[] sortDoubleArraySlow(double[] input){
double tmp;
int operationNumber = 0;
for (int j = 0; j < input.length; j++) {
for (int i = 0; i < input.length; i++) {
operationNumber++;
if(input[i]>input[j]){
tmp = input[j];
input[j] = input[i];
input[i] = tmp;
}
}
}
System.out.println("Operation number in Slow: "+operationNumber);
return input;
}
public static double[] sortDoubleArrayFast(double[] input){
double tmp;
int operationNumber = 0;
for (int j = 0; j < input.length-1; j++) {
for (int i = j+1; i < input.length; i++) {
operationNumber++;
if(input[i]>input[j]){
tmp = input[j];
input[j] = input[i];
input[i] = tmp;
}
}
}
System.out.println("Operation number in Fast: "+operationNumber);
return input;
}
}
解决方案
我很惊讶这个问题被否决了,因为从评论中可以看出,答案一点也不明显。您的问题的答案“相对”简单 - JIT。当我们有一个每次都做完全相同的事情的循环时,JIT 将它变成一段本机代码并直接执行它。但是,当我们每次执行都改变内部循环时(改变 start i = j + 1),那么 JIT 就不起作用了,所以 JVM 必须重新解释它,这已经造成了时间开销。
推荐阅读
- python - Python函数异常错误
- opencv - 如何使用openCV识别连接组件的最窄部分?
- sql - 从本月获取去年的数据 SQL
- python - 使用 Python 从 sql server 数据库中检索数据
- mysql - 将此 Sql 转换为 Eloquent
- ios - 谁能告诉我如何删除 CarbonKit 中的深灰色底边边框
- sql - 引用创建的易失性表导致过程中不存在错误
- maven - 从命令提示符运行 TestNG 'Maven' 项目时出现错误“无法初始化主类 org.testng.TestNG”
- oracle - 无法通过 tnsnames 登录
- laravel - Laravel 页面速度 - 跳过路线