php對陣列進行全排列的非遞迴演算法

餘二五發表於2017-11-07

  1. /**
  2. * 取得陣列的全排列
  3. *
  4. * @author ustb80
  5. * @param array $source 待排列陣列,一維
  6. * @return array
  7. */
  8. function getAllPerm($source
  9.     $rs = array(); 
  10.     sort($source); 
  11.     $last = count($source) – 1; 
  12.     $z = 0; 
  13.     $x = $last
  14.     $rs[] = $source
  15.  
  16.     while($x > 0) 
  17.     { 
  18.         // 相鄰的兩個元素,先將x的值賦給y,x再自減1 
  19.         $y = $x–; 
  20.  
  21.         // 如果前一個元素的值小於後一個元素的值 
  22.         if($source[$x] < $source[$y]) 
  23.         { 
  24.             // 從尾部開始,找到第一個大於 $x 元素的值 
  25.             $z = $last
  26.             while($source[$x] > $source[$z]) 
  27.             { 
  28.                 $z–; 
  29.             } 
  30.  
  31.             // 交換 $x 和 $z 元素的值 
  32.             list($source[$x], $source[$z]) = array($source[$z], $source[$x]); 
  33.  
  34.             // 將 $y 之後的元素全部逆向排列 
  35.             for($i = $last$i > $y$i–, $y++) 
  36.             { 
  37.                 list($source[$i], $source[$y]) = array($source[$y], $source[$i]); 
  38.             } 
  39.             $rs[] = $source
  40.             $x = $last
  41.         } 
  42.     } 
  43.     return $rs
  44.  
  45. $source = array(1,2,3); 
  46. $rs = getAllPerm($source); 
  47. print_r($rs); 

輸出結果:


  1. Array 
  2.     [0] => Array 
  3.         ( 
  4.             [0] => 1 
  5.             [1] => 2 
  6.             [2] => 3 
  7.         ) 
  8.  
  9.     [1] => Array 
  10.         ( 
  11.             [0] => 1 
  12.             [1] => 3 
  13.             [2] => 2 
  14.         ) 
  15.  
  16.     [2] => Array 
  17.         ( 
  18.             [0] => 2 
  19.             [1] => 1 
  20.             [2] => 3 
  21.         ) 
  22.  
  23.     [3] => Array 
  24.         ( 
  25.             [0] => 2 
  26.             [1] => 3 
  27.             [2] => 1 
  28.         ) 
  29.  
  30.     [4] => Array 
  31.         ( 
  32.             [0] => 3 
  33.             [1] => 1 
  34.             [2] => 2 
  35.         ) 
  36.  
  37.     [5] => Array 
  38.         ( 
  39.             [0] => 3 
  40.             [1] => 2 
  41.             [2] => 1 
  42.         ) 
  43.  
本文轉自 ustb80 51CTO部落格,原文連結:http://blog.51cto.com/ustb80/1033843,如需轉載請自行聯絡原作者


相關文章