2017-04-16 254 views
2

這兩個實現之間的區別我覺得這兩個實現都在做同樣的事情,但如果你可以讓我知道它們是否(性能明智)做同樣的事情(例如在數字方面的指令執行)。謝謝。插入排序

<?php 

$arr = array(10, 2, 3, 14, 16); 

function sortOne($arr) { 

    $instructionCount = 0; 

    for ($i = 1; $i < count($arr); $i++) { 
     $instructionCount++; 
     for ($j = $i - 1; $j >= 0 && ($arr[$j] > $arr[$i]); $j--) { 
      $instructionCount++; 

      $tmp = $arr[$i]; 
      $arr[$i] = $arr[$j]; 
      $arr[$j] = $tmp; 

     } 
    } 

    echo "\nTotal Instructions for Sort One: $instructionCount\n"; 

    return $arr; 
} 

function sortTwo($array) { 

    $instructionCount = 0; 

    for($j=1; $j < count($array); $j++){ 
     $instructionCount++; 
     $temp = $array[$j]; 
     $i = $j; 
     while(($i >= 1) && ($array[$i-1] > $temp)){ 
      $instructionCount++; 
      $array[$i] = $array[$i-1]; 
      $i--; 
     } 
     $array[$i] = $temp; 
    } 

    echo "\nTotal Instructions for Sort Two: $instructionCount\n"; 

    return $array; 
} 


var_dump(sortOne($arr)); 
+0

我只想指出,你可以使用[sort](http://php.net/manual/en/function.sort.php)函數來排序你的數組 –

+1

謝謝@AmrAly我知道,但我是對算法分析感興趣否則肯定會使用庫函數 –

+0

@SoftwareGuy你的第一個函數不能正確地對數組進行排序。 –

回答

0

不,他們是不一樣的。功能sortOne錯誤執行insertion sort

正確執行的功能sortOne是:

for ($i = 1; $i < count($arr); $i++) { 
    $instructionCount++; 
    $temp = $arr[$i]; 
    for ($j = $i - 1; $j >= 0 && ($arr[$j] > $temp); $j--) { 
     $instructionCount++; 
     $arr[$j + 1] = $arr[$j];     
    } 
    $arr[$j + 1] = temp; 
} 

現在考慮的表現,他們基本上有相同的性能。只要將循環更改爲while循環,您不會得到任何性能變化。

+0

謝謝@Sumeet。你能解釋一下,如何將$ temp變量聲明和最終賦值移出內部循環有什麼不同?如果實現是錯誤的,它有什麼問題? –

+0

@SoftwareGuy在插入排序中,我們在已排序的數組[0 ..... i-1]中插入第i個元素,表示排序到位置i - 1的數組。當我們在位置0找到更大的元素時, 1,我們把它移到更大的位置。但是比較總是通過位置i處的元素完成的,該元素保持不變,因此我們必須使用temp變量而不是實際元素。 –

+0

謝謝@Sumeet - 由於您的澄清,發現我的錯誤。我已經接受了答案。謝謝你! –