起因
好吧,我承認最近我跟快速排序幹上了,各種測試編寫快速排序程式,現在就用php實現快速排序,跟之前文章不同,這次php的快排是能解決實際需要的.下面的文章裡我會用c語言的思想提出兩種php快速排序的解決方案:
- 自己實現快速排序,用分治和歸併的思想
- 調用系統的usort,類似於c的qsort,感謝dickeylth的提醒
使用環境和條件有這樣一種情況,php裡面的關聯陣列,如果下面這樣的數組資料:
$array = array (array ('name' => "xiao",'age' => 3 ),array ('name' => 'wang','age' => 1 ),array ('name' => 'chen','age' => 2 ) );
我們要對數組針對age欄位進行排序,php內建的簡單sort功能函數,顯然都不能滿足我們的需求,因此我們可以自己寫一個快速排序代碼,很快的實現我們的要求注意情況php裡面是沒有指標存在的,所以當想要引用傳遞的時候,我們不能跟C代碼一樣,直接這樣寫quicksort(int *A, int begin, int end),而是要使用php的&運算子,將數組的地址傳遞跟快速排序函數,這樣就能在php裡實現引用傳遞而不是值傳遞快速排序代碼分治+歸併實現快排
/** * Description:擷取中樞點的位置 * * @param array $array * @param int $left * @param int $right * @param string $field * @return int */function fetchArrayPivot (&$array, $left, $right, $field){ // 基準定義 $stand = $array[$left]; // 遍曆數組 while ($left < $right) { while ($left < $right && $array[$right][$field] >= $stand[$field]) { $right --; } if ($left < $right) { $array[$left ++] = $array[$right]; } while ($left < $right && $array[$left][$field] <= $stand[$field]) { $left ++; } if ($left < $right) { $array[$right --] = $array[$left]; } } // 擷取中樞點位置 $array[$left] = $stand; return $left;}/** * Description:快速排序主程式 * * @param array $array * @param int $begin * @param int $end * @param string $field */function quickSort (&$array, $begin, $end, $field){ // 變數定義 $pivot = null; if ($begin < $end) { $pivot = fetchArrayPivot($array, $begin, $end, $field); quickSort($array, $begin, $pivot - 1, $field); quickSort($array, $pivot + 1, $end, $field); }}
調用樣本
<?php$array = array( array( 'name' => "xiao", 'age' => 3 ), array( 'name' => 'wang', 'age' => 1 ), array( 'name' => 'chen', 'age' => 2 ), array( 'name' => 'zhengyi', 'age' => 4 ), array( 'name' => 'chai', 'age' => 14 ));$begin = getTime();quickSort($array, 0, count($array) - 1, 'age');print_r($array);$end = getTime();$spend = $end - $begin;echo "花費時間為:".$spend."秒\n";function getTime(){ list($msec, $sec) = explode(" ", microtime()); return (float)$msec + (float)$sec;}
實現效果調用系統的usort類似c裡面調用qsort,需要自己寫比較函數,跟c類似
/** * Description:類似於c中qsort的比較函數 * * @param array $a * @param array $b * @param string $field * @return int */function compare ($a, $b){ return $a['age'] - $b['age'];}usort($array, "compare");
調用樣本
<?php$array = array( array( 'name' => "xiao", 'age' => 3 ), array( 'name' => 'wang', 'age' => 1 ), array( 'name' => 'chen', 'age' => 2 ), array( 'name' => 'zhengyi', 'age' => 4 ), array( 'name' => 'chai', 'age' => 14 ));$begin = getTime();usort($array, "compare");print_r($array);$end = getTime();$spend = $end - $begin;echo "花費時間為:" . $spend . "秒\n";function getTime (){ list ($msec, $sec) = explode(" ", microtime()); return (float) $msec + (float) $sec;}
實現效果