鍍金池/ 問答/PHP  網(wǎng)絡(luò)安全/ 請(qǐng)問PHP中for循環(huán)兩個(gè)條件判斷的詳細(xì)執(zhí)行過程?

請(qǐng)問PHP中for循環(huán)兩個(gè)條件判斷的詳細(xì)執(zhí)行過程?

//第一種寫法
 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]);
 }

上面兩種寫法運(yùn)行結(jié)果是等價(jià)的!!!

請(qǐng)問第二種寫法中這個(gè)條件:$j > 0 && $arr[$j] < $arr[$j-1]滿足,執(zhí)行{}中的代碼,為什么$j -- 沒有到0呢?

是不是第二種寫法滿足條件只執(zhí)行一次????

回答
編輯回答
好難瘦

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

/**
 * 插入排序:尋找元素arr[i]合適的插入位置,使索引數(shù)組中下標(biāo)為'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,插入排序和選擇排序最大區(qū)別是插入排序可以提前結(jié)束
        for( $j = $i ; $j > 0 && $arr[$j] < $arr[$j-1] ; $j -- )
                swap( $arr[$j-1],$arr[$j]);
                
        // 寫法3,減少交換賦值次數(shù)(上兩種寫法交換一次會(huì)有三次賦值),提升性能
//        $e = $arr[$i];
//        for ($j = $i; $j > 0 && $arr[$j-1] > $e; $j--)
//            $arr[$j] = $arr[$j-1];
//        // j保存元素e應(yīng)該插入的位置
//        $arr[$j] = $e;
    }

    return $arr;
}
2017年10月29日 06:13
編輯回答
尕筱澄

你都寫了$j > 0了,當(dāng)然你的循環(huán)體只能在$j>0的時(shí)候執(zhí)行,$j是可以到0的,只是你循環(huán)體內(nèi)到不了0

2017年5月22日 04:59