function quick(&$arr,$low,$high){    $key = $low;
    
    for($i=$low,$j=$high;$i!=$j;){
    
       for(;$j>$key;){
    
           if($arr[$j]<$arr[$key]){               list($arr[$j],$arr[$key])=swap($arr[$j],$arr[$key]);     
               $key = $j;
               break;           }else{               $j--;           }
    
       }
    
       for(;$i<$key;){
    
           if($arr[$i]>$arr[$key]){               list($arr[$i],$arr[$key])=swap($arr[$i],$arr[$key]);     
               $key = $i;
               break;           }else{               $i++;           }
    
       }
    }
 
    if($high>$low){         quick($arr,$low,$key-1); 
        quick($arr,$key+1,$high);    }}$arr = array(7,4,9,1,3,2,6,8,0);
quick($arr,0,8);
print_r($arr);
不递归的话单跑一遍正常(去掉if($high>$low)那一段)。一递归就不行了,Chrome转半天,应该是无限递归下去了。请问一下问题出在哪呢?php算法快递排序

解决方案 »

  1.   


    主要看下 if($high>$low){ 
     
            quick($arr,$low,$key-1); 
            quick($arr,$key+1,$high);
     
     }这里,因为我单独测试quick是可以正常运行的。这里就不停递归了。
      

  2.   

    已解决没有考虑第一位和最后一位的特殊情况,会造成low大于high传入函数,无限循环。
     if($high>$low){         if($key != $low) {
                quick($arr,$low,$key-1);
            }
             
            if($key != $high) {
                quick($arr,$key+1,$high);
            }    }