请问PHP中for循环两个条件判断的详细执行过程?

//第一种写法
 for( $j = $i ; $j > 0 ; $j-- ){
     if( $arr[$j] < $arr[$j-1] )
            swap($arr[$j-1],$arr[$j]);
      else
            break;
  }
        
 //第二种写法      
 for( $j = $i ; $j > 0 && $arr[$j] < $arr[$j-1]; $j -- ){
      echo $j.'<p>';
      swap( $arr[$j-1],$arr[$j]);
 }

上面两种写法运行结果是等价的!!!

请问第二种写法中这个条件:$j > 0 && $arr[$j] < $arr[$j-1]满足,执行{}中的代码,为什么$j -- 没有到0呢?

是不是第二种写法满足条件只执行一次????

阅读 5.3k
2 个回答

哈哈,分析了一下,弄明白了,完整的代码如下:

/**
 * 插入排序:寻找元素arr[i]合适的插入位置,使索引数组中下标为'i'之前的元素有序
 * 
 * @param $arr
 * @return mixed
 */
function insertionSort($arr)       
{
    for( $i = 1 ; $i < count($arr) ; $i ++ ) {

        // 寻找元素arr[i]合适的插入位置
        // 写法1
//        for( $j = $i ; $j > 0 ; $j-- )
//            if( $arr[$j] < $arr[$j-1] )
//                $arr = swap($arr,$j);
//            else
//                break;

        // 写法2,插入排序和选择排序最大区别是插入排序可以提前结束
        for( $j = $i ; $j > 0 && $arr[$j] < $arr[$j-1] ; $j -- )
                swap( $arr[$j-1],$arr[$j]);
                
        // 写法3,减少交换赋值次数(上两种写法交换一次会有三次赋值),提升性能
//        $e = $arr[$i];
//        for ($j = $i; $j > 0 && $arr[$j-1] > $e; $j--)
//            $arr[$j] = $arr[$j-1];
//        // j保存元素e应该插入的位置
//        $arr[$j] = $e;
    }

    return $arr;
}

你都写了$j > 0了,当然你的循环体只能在$j>0的时候执行,$j是可以到0的,只是你循环体内到不了0

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题