Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在for循环中添加条件可以显著提高速度_Java_Sorting - Fatal编程技术网

Java 为什么在for循环中添加条件可以显著提高速度

Java 为什么在for循环中添加条件可以显著提高速度,java,sorting,Java,Sorting,我正在用Java编写Shellsort,发现在for循环中添加一个条件可以显著提高速度。有人能解释一下原因吗 这是快速代码,10公里双打80毫秒 公共静态无效排序(可比[]a){ 如果(a.length=1){ for(int i=magic;i=magic&&less(a[j],a[j-magic]);j-=magic){ //if(小于(a[j],a[j-魔术]){ exch(a,j,j-魔法); // } } /* 对于(int j=0;jj;k-=1){ 行政会议(a,k-1,k); }

我正在用Java编写Shellsort,发现在for循环中添加一个条件可以显著提高速度。有人能解释一下原因吗

这是快速代码,10公里双打80毫秒

公共静态无效排序(可比[]a){
如果(a.length=1){
for(int i=magic;i=magic&&less(a[j],a[j-magic]);j-=magic){
//if(小于(a[j],a[j-魔术]){
exch(a,j,j-魔法);
// }
}
/*
对于(int j=0;jj;k-=1){
行政会议(a,k-1,k);
}
打破
}
}
*/
}
魔法/=3;
}
}
慢版本(我将在这里放置内部for循环)大约需要43000毫秒

for(int j=i;j>=magic;j-=magic){
if(小于(a[j],a[j-魔术]){
exch(a,j,j-魔法);
}
}
请注意,
less
功能只需检查
a[j]
是否小于
a[j-magic]


据我所知,在快速代码中,我们仍然检查每个循环的
less
标准,如果不满足,我们就不进入循环。在慢版本中,我们会进入每个循环,即使
less
不满足于我们不进行交换。我不明白的是为什么快速代码要快得多?C++也是一样吗?(我可以自己测试C++部分)

让我们考虑循环的慢版本:

for (int j = i; j >= magic; j -= magic) {
      if (less(a[j], a[j - magic])) {
             exch(a, j, j - magic);
      }
}
在这个循环中,我们为
j
的每个值调用
less
,对于
less
返回true的值,我们调用
exch
。这种情况一直持续到
j>=magic

现在,让我们看看更快的版本:

for (int j = i; j >= magic && less(a[j], a[j - magic]); j -= magic) {
     exch(a, j, j - magic);
}
在这个版本中,我们还为
j
的每个值调用
less
,但是对于
j
的第一个值,它返回false,执行退出循环。因此,在循环退出后的这种情况下,
j
。因此,许多对
exch
less
的调用都保存在这里,从而实现了优化


<>这对每种语言都是一样的。

让我们考虑循环的慢版本:

for (int j = i; j >= magic; j -= magic) {
      if (less(a[j], a[j - magic])) {
             exch(a, j, j - magic);
      }
}
在这个循环中,我们为
j
的每个值调用
less
,对于
less
返回true的值,我们调用
exch
。这种情况一直持续到
j>=magic

现在,让我们看看更快的版本:

for (int j = i; j >= magic && less(a[j], a[j - magic]); j -= magic) {
     exch(a, j, j - magic);
}
在这个版本中,我们还为
j
的每个值调用
less
,但是对于
j
的第一个值,它返回false,执行退出循环。因此,在循环退出后的这种情况下,
j
。因此,许多对
exch
less
的调用都保存在这里,从而实现了优化


这对每种语言都是一样的。

谢谢@Charchit Kapoor你完全正确!我怎么没意识到?我应该从我的编程入门课程中知道这一点……我想这是因为我在自己的代码中从来没有这样做过。它发生在@NicholasHumphrey,我们总有一天会错过这些要点。谢谢@Charchit Kapoor你说得绝对正确!我怎么没意识到?我应该从我的编程入门课程中知道这一点……我想这是因为我在自己的代码中从来没有这样做过。它发生在@NicholasHumphrey,我们总有一天会错过这些要点。