Java 为什么在for循环中添加条件可以显著提高速度
我正在用Java编写Shellsort,发现在for循环中添加一个条件可以显著提高速度。有人能解释一下原因吗 这是快速代码,10公里双打80毫秒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); }
公共静态无效排序(可比[]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,我们总有一天会错过这些要点。