2

请看一下这个来自快速排序的代码片段和实现,它来自《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都是独立的,一个将较低的值与枢轴进行比较,一个比较较高的值,在满足每个while循环标准时进行交换。每次 for 循环继续执行该过程时, i 递增并且 j 递减,直到满足 if 语句的条件,此时它会从 for 循环中中断?它是否正确?

编辑:更新代码以准确反映书中的内容。

4

4 回答 4

6

你的分析是正确的。循环使用和隐式完成它们的while工作。它可以重写为更清晰++i--j

do i++; while (array[i] < pivot);
do j--; while (pivot < array[j]);
于 2013-01-15T09:52:38.920 回答
0

while 循环是空的 - 实际工作是在其谓词中的递增和递减运算符中完成的。

for 循环实际上也是一个无限循环,仅当 i >= j 时才由 break 语句退出。

它的语法有点奇怪——我不确定我是这样写的——可能是过早的优化......

于 2013-01-15T09:52:25.823 回答
0

是的,您的评估是正确的。

省略边界条件和步骤指令并不少见。你甚至看到

for (;;) {
...
}

很多时候,构建一个无限循环。另一方面,更严格的代码约定(NASA、关键任务、实时系统)明确禁止代码中的无限循环。

while构造是合法的,但非常丑陋。如果我正在审查团队中某人的代码,我不会接受这种结构。一方面,我非常严格地要求在所有条件和循环块周围使用大括号,即使它们只有一行。

考虑这个语法上合法的结构并考虑它的作用

int i = 0;
while (i++ < 10)                                                                ;
{
    System.out.println(i);
}
于 2013-01-15T10:01:38.617 回答
0

这里的for循环只是用于初始化。for循环中没有指定增量或任何规则。这意味着for循环将继续执行,直到它遇到abreak语句。

while(array[++i] - pivot < 0); 这意味着每一步 i 将递增 1 并检查条件。此 while 循环将持续到 (array[++i] - pivot ) 等于或大于 0。然后执行将转到下一个 while 循环 while(pivot - array[--j] < 0) 这个while循环将持续到(pivot - array[--j] ) 等于或大于0。然后它会检查if条件。如果满足,它将中断主循环。否则,函数 swapReferences 将被执行并且 for 循环将继续。

于 2013-01-15T10:19:30.590 回答