请查看此代码段和快速排序的实现,它来自书籍Data Structures and Problem Solving Using Java:
int i, j;
for(i = low, j = high -1;;){
while(array[++i].compareTo(pivot) < 0)
;
while(pivot.compareTo(array[--j]) < 0)
;
if(i >= j)
break;
swapReferences(array, i, j);
}
我在理解其工作原理时遇到了一些麻烦。根据我的理解,for循环只是声明起点,并且不包含何时完成for循环的任何规则;这是由if语句处理的,这是正确的吗? 此外,没有括号我不清楚while循环。分号和缺少缩进表明它们没有嵌套。但是循环中没有实际的代码。 我是正确的说,每一次是分开的,一个比较较低的值与枢轴,一个比较较高的值,交换时满足每个while循环标准。每当for循环继续进行时,i递增并且j递减,直到满足if语句的条件,此时它从for循环中断开? 它是否正确?
编辑:更新了代码以准确反映书中的内容。
答案 0 :(得分:4)
您的分析是正确的。 while
循环使用++i
和--j
隐式执行其工作。
do i++; while (array[i] < pivot);
do j--; while (pivot < array[j]);
答案 1 :(得分:0)
while循环是空的 - 实际工作是在谓词中的递增和递减运算符中完成的。
for循环实际上也是一个无限循环,当i> = j时,它只会被break语句退出。
它的语法略显奇怪 - 我不确定Id是这样编写的 - 可能是过早的优化......
答案 2 :(得分:0)
是的,你的评估是正确的。
省略边界条件和步骤指令并不常见。你甚至看到了
for (;;) {
...
}
经常构造一个无界循环。另一方面,更严格的代码约定(NASA,任务关键型,实时系统)明确禁止代码中的无界循环。
while
构造是合法的,但非常难看。如果我正在审查团队成员的代码,我不会接受这种构造。首先,我非常严格要求在所有条件和循环块周围使用大括号,即使它们只是一行。
考虑这个语法上合法的构造并考虑它的作用
int i = 0;
while (i++ < 10) ;
{
System.out.println(i);
}
答案 3 :(得分:0)
这里for循环只用于初始化。在for循环中没有指定增量或任何规则。这意味着for循环将一直持续到它击中abreak语句。
while(array [++ i] - pivot&lt; 0); 这意味着每个步骤i将增加1并检查条件。这个while循环将一直到(array [++ i] - pivot)等于或大于0。 然后执行将转到下一个while循环 while(pivot - array [ - j]&lt; 0) 这个while循环将一直到(pivot - array [ - j])等于或大于0。 然后它将检查if条件。如果满足,它将从main for循环中断。 否则,函数swapReferences将被执行,for循环将继续。