不寻常的寻找和while循环中使用的循环(Java)

时间:2013-01-15 09:48:41

标签: java algorithm sorting loops quicksort

请查看此代码段和快速排序的实现,它来自书籍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循环中断开? 它是否正确?

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

4 个答案:

答案 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循环将继续。