o(n^)級別的排序演算法和php原生sort效能對比
阿新 • • 發佈:2019-01-05
測試樣本為5000
測試結果
原生sort:0.002000093460083
氣泡排序:3.9222249984741
選擇排序:2.8271610736847
插入排序:1.9501118659973
希爾排序:0.053003072738647
希爾排序為o(n^)級別排序演算法中最快的演算法
以下為測試程式碼
/* * 檢查排序結果是否正確 * @param array array 測試資料樣本 * @param n int 測試樣本數量 * */ function checkArraySort($array,$n){ for($i = 0;$i < $n - 1;$i++){ if($array[$i] > $array[$i + 1]){ return false; } } return true; } /* * 氣泡排序 * @param array array 測試資料樣本 * @param n int 測試樣本數量 * */ function mpSort($array,$n){ for($i = 0;$i < $n;$i++){ $flag = 0; for($j = $i + 1;$j < $n;$j++){ if($array[$i] > $array[$j]){ $temp = $array[$i]; $array[$i] = $array[$j];$array[$j]= $temp; } } } if(!checkArraySort($array,$n)){ echo 'error'; exit; } } /* * 拆入排序 * @param array array 測試資料樣本 * @param n int 測試樣本數量 * */ function insertSort($array,$n){ for($i = 1;$i < $n;$i++){ $e = $array[$i]; for($j = $i;$j > 0 && $array[$j - 1] >$e;$j--){ $array[$j] = $array[$j - 1]; } $array[$j] = $e; } if(!checkArraySort($array,$n)){ print_r($array);exit; echo 'error'; exit; } } /* * 選擇排序 * @param array array 測試資料樣本 * @param n int 測試樣本數量 * */ function selectSort($array,$n){ for($i = 0;$i < $n;$i++){ $minIndex = $i; for($j = $i + 1;$j < $n;$j++){ if($array[$minIndex] > $array[$j]){ $minIndex = $j; } } if($minIndex != $i){ $temp = $array[$minIndex]; $array[$minIndex] = $array[$i]; $array[$i] = $temp; } } if(!checkArraySort($array,$n)){ echo 'error'; exit; } } /* * 希爾排序 * @param array array 測試資料樣本 * @param n int 測試樣本數量 * */ function shellSort($array,$n){ $f = 2; for ($gap = $n / $f; $gap > 0; $gap = intval($gap / $f)){ for($i = $gap; $i < $n;$i++){ $j = $i; while($j - $gap >= 0 && $array[$j] < $array[$j - $gap]){ $temp = $array[$j]; $array[$j] = $array[$j-$gap]; $array[$j-$gap] = $temp; $j -= $gap; } } } if(!checkArraySort($array,$n)){ echo 'error'; exit; } } /* * 測試排序演算法 * @param functionDesc string 排序函式描述 * @param functionName string 排序函式名稱 * @param array array 測試資料樣本 * */ function testArray($functionDesc,$functionName,$array){ $n = count($array); $startTime = microtime(true); $functionName($array,$n); $endTime = microtime(true); $time = $endTime - $startTime; echo "{$functionDesc}:{$time}<br>"; } /* * 生成測試資料 * @param arrayNumber int 生成測試資料的數量 * @param randMin int 生成測試資料的最小值 * @param randMax int 生成測試資料的最大值 * return array * */ function generateTestData($arrayNumber,$randMin = 0,$randMax = 0){ if($randMax == 0){ $randMax = $arrayNumber; } for($i = 0; $i < $arrayNumber; $i++){ $array[] = mt_rand($randMin,$randMax); } return $array; } $array = generateTestData(5000); $array1 = $array; $array2 = $array; $array3 = $array; $array4 = $array; testArray("原生sort",'sort',$array); testArray("氣泡排序",'mpSort',$array1); testArray("選擇排序",'selectSort',$array2); testArray("插入排序",'insertSort',$array3); testArray("希爾排序",'shellSort',$array4);