2016-09-30 107 views
1

據我所知,這兩個程序應該做同樣的事情。但是,Python版本可以工作,而PHP版本不能。請問我錯過了什麼?泡沫排序在PHP和Python

def bubbleSort(alist): 
    for passnum in range(len(alist)-1,0,-1): 
     for i in range(passnum): 
      if alist[i]>alist[i+1]: 
       temp = alist[i] 
       alist[i] = alist[i+1] 
       alist[i+1] = temp 

my_list = [2,3,5,4,1] 
bubbleSort(my_list) 
print(my_list) 

<?php 
// Bubble Sort 
$my_list = [2,3,5,4,1]; 

function bubble_sort($arr){ 
    $size = count($arr); 
    for($pass_num = $size - 1; $pass_num >= 0; $pass_num--){ 
     for($i = 0; $i < $pass_num; $i++){ 
      if($arr[i] > $arr[$i + 1]){ 
       swap($arr, $arr[i], $arr[$i+1]); 
      } 
     } 
    } 
} 


function swap(&$arr, $a, $b) { 
    $tmp = $arr[$a]; 
    $arr[$a] = $arr[$b]; 
    $arr[$b] = $tmp; 
} 

bubble_sort($my_list); 
print_r ($my_list); 
+0

唯一的一次,其實我已經做了冒泡排序在大學上。所以我猜這是作業吧? – RiggsFolly

+0

實際上沒有。從40多歲開始自學! – Robin

+0

不熟悉PHP,但你代碼的方式我猜在swap中聲明'&$ arr'意味着參數是通過引用傳遞的?如果是這樣,那麼在PHP排序函數的聲明中不會通過引用傳遞數組,因此在函數返回後沒有對數組進行排序。 – xuanluong

回答

1

排序實際上是在工作,但你不傳遞給bubble_sort($arr)函數的引用,你從來沒有看到實際的結果。告訴bubble_sort()該陣列由引用傳遞意味着你正在改變$my_list而不是$my_list

哦副本,你有一些編譯錯誤,使用$arr[i]代替$arr[$i]

// Bubble Sort 
$my_list = [2,3,5,4,1]; 

function bubble_sort(&$arr){ // <-- changed to &$arr 
    $size = count($arr); 
    for($pass_num = $size - 1; $pass_num >= 0; $pass_num--){ 
     for($i = 0; $i < $pass_num; $i++){ 
      if($arr[$i] > $arr[$i + 1]){ 
       // also changed this line to pass just the indexes 
       swap($arr, $i, $i+1); 
      } 
     } 
    } 
} 


function swap(&$arr, $a, $b) { 
    $tmp = $arr[$a]; 
    $arr[$a] = $arr[$b]; 
    $arr[$b] = $tmp; 
} 

bubble_sort($my_list); 
print_r ($my_list); 

如果要測試這個在關閉錯誤報告的實時服務器上,將這些行添加到正在開發的任何腳本的頂部,而您正在開發它。

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 

而且編譯錯誤會顯示網頁

+0

謝謝@RiggsFolly。在函數參數中'&'可能需要幾周才能解決!另外我看到我正在將元素與它們的指數混合在交換中。 – Robin

+1

沒問題,40多歲的我們一起堅持着 – RiggsFolly