PHP的几种排序算法的比较
生活随笔
收集整理的這篇文章主要介紹了
PHP的几种排序算法的比较
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?
這里列出了幾種PHP的排序算法的時間比較的結(jié)果,,希望對大家有所幫助
/** php 四種排序算法的時間與內(nèi)置的sort排序比較* 3000個元素,四種算法的排序所用的時間比較* 冒泡排序 857.98192024231ms* 選擇排序 903.74493598938ms* 插入排序 296.8270778656ms* 快速排序 15.607833862305ms* sort排序 0.95200538635254ms* 歸并排序 14.61386680603ms* *//* * @param 冒泡排序 * 它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。 * 走訪數(shù)列的工作是重復(fù)地進行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。 * */ function BubbleSort($arr) {$len = count($arr);//設(shè)置一個空數(shù)組 用來接收冒出來的泡//該層循環(huán)控制 需要冒泡的輪數(shù)for ($i = 1; $i < $len; $i++) {$flag = false; //本趟排序開始前,交換標(biāo)志應(yīng)為假//該層循環(huán)用來控制每輪 冒出一個數(shù) 需要比較的次數(shù)for ($k = 0; $k < $len - $i; $k++) {//從小到大排序if ($arr[$k] > $arr[$k + 1]) {$tmp = $arr[$k + 1];$arr[$k + 1] = $arr[$k];$arr[$k] = $tmp;$flag = true;}}if(!$flag) return $arr;} }/* * @param 選擇排序法 * 每一次從待排序的數(shù)據(jù)元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數(shù)據(jù)元素排完。 * 選擇排序是不穩(wěn)定的排序方法(比如序列[5, 5, 3]第一次就將第一個[5]與[3]交換,導(dǎo)致第一個5挪動到第二個5后面) * */ function selectSort($array){$temp = 0;for($i = 0;$i < count($array) - 1;$i++){$minVal = $array[$i]; //假設(shè)$i就是最小值$minValIndex = $i;for($j = $i+1;$j < count($array);$j++){if($minVal > $array[$j]){ //從小到大排列$minVal = $array[$j]; //找最小值$minValIndex = $j;}}$temp = $array[$i];$array[$i] = $array[$minValIndex];$array[$minValIndex] = $temp;} }/* * 插入排序法 * 每步將一個待排序的紀錄,按其關(guān)鍵碼值的大小插入前面已經(jīng)排序的文件中適當(dāng)位置上,直到全部插入完為止。 * 算法適用于少量數(shù)據(jù)的排序,時間復(fù)雜度為O(n^2)。是穩(wěn)定的排序方法。 * */ function insertSort($array){ //從小到大排列 //先默認$array[0],已經(jīng)有序,是有序表for($i = 1;$i < count($array);$i++){$insertVal = $array[$i]; //$insertVal是準(zhǔn)備插入的數(shù)$insertIndex = $i - 1; //有序表中準(zhǔn)備比較的數(shù)的下標(biāo)while($insertIndex >= 0 && $insertVal < $array[$insertIndex]){$array[$insertIndex + 1] = $array[$insertIndex]; //將數(shù)組往后挪$insertIndex--; //將下標(biāo)往前挪,準(zhǔn)備與前一個進行比較 }if($insertIndex + 1 !== $i){$array[$insertIndex + 1] = $insertVal;}} }/* * 快速排序法 * 通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小, * 然后再按此方法對這兩部分數(shù)據(jù)分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數(shù)據(jù)變成有序序列。 * */ function quickSort($array){if(!isset($array[1])) return $array;$mid = $array[0]; //獲取一個用于分割的關(guān)鍵字,一般是首個元素$leftArray = array();$rightArray = array();foreach($array as $v){if($v > $mid)$rightArray[] = $v; //把比$mid大的數(shù)放到一個數(shù)組里if($v < $mid)$leftArray[] = $v; //把比$mid小的數(shù)放到另一個數(shù)組里 }$leftArray = quickSort($leftArray); //把比較小的數(shù)組再一次進行分割$leftArray[] = $mid; //把分割的元素加到小的數(shù)組后面,不能忘了它哦$rightArray = quickSort($rightArray); //把比較大的數(shù)組再一次進行分割return array_merge($leftArray,$rightArray); //組合兩個結(jié)果 }/* * 歸并排序 * 歸并排序是指將兩個或兩個以上有序的數(shù)列(或有序表),合并成一個仍然有序的數(shù)列(或有序表)。 * 這樣的排序方法經(jīng)常用于多個有序的數(shù)據(jù)文件歸并成一個有序的數(shù)據(jù)文件。 * */ function mergeSort(&$arr) {$len = count($arr);//求得數(shù)組長度mSort($arr, 0, $len-1);return $arr; } //實際實現(xiàn)歸并排序的程序 function mSort(&$arr, $left, $right) {if($left < $right) {//說明子序列內(nèi)存在多余1個的元素,那么需要拆分,分別排序,合并//計算拆分的位置,長度/2 去整$center = floor(($left+$right) / 2);//遞歸調(diào)用對左邊進行再次排序: mSort($arr, $left, $center);//遞歸調(diào)用對右邊進行再次排序mSort($arr, $center+1, $right);//合并排序結(jié)果 mergeArray($arr, $left, $center, $right);} } //將兩個有序數(shù)組合并成一個有序數(shù)組 function mergeArray(&$arr, $left, $center, $right) {//設(shè)置兩個起始位置標(biāo)記$a_i = $left;$b_i = $center+1;while($a_i<=$center && $b_i<=$right) {//當(dāng)數(shù)組A和數(shù)組B都沒有越界時if($arr[$a_i] < $arr[$b_i]) {$temp[] = $arr[$a_i++];} else {$temp[] = $arr[$b_i++];}}//判斷 數(shù)組A內(nèi)的元素是否都用完了,沒有的話將其全部插入到C數(shù)組內(nèi):while($a_i <= $center) {$temp[] = $arr[$a_i++];}//判斷 數(shù)組B內(nèi)的元素是否都用完了,沒有的話將其全部插入到C數(shù)組內(nèi):while($b_i <= $right) {$temp[] = $arr[$b_i++];}//將$arrC內(nèi)排序好的部分,寫入到$arr內(nèi):for($i=0, $len=count($temp); $i<$len; $i++) {$arr[$left+$i] = $temp[$i];} }$a = array_rand(range(1,10000), 3000); //生成3000個元素的隨機數(shù)組 shuffle($a); //打亂數(shù)組的順序 $t1 = microtime(true); BubbleSort($a); //冒泡排序 $t2 = microtime(true); echo "冒泡排序用時:".(($t2-$t1)*1000).'ms'."\n";$t3 = microtime(true); selectSort($a); //選擇排序 $t4 = microtime(true); echo "選擇排序用時:".(($t4-$t3)*1000).'ms'."\n";$t5 = microtime(true); insertSort($a); //插入排序 $t6 = microtime(true); echo "插入排序用時:".(($t6-$t5)*1000).'ms'."\n";$t7 = microtime(true); quickSort($a); //快速排序 $t8 = microtime(true); echo "快速排序用時:".(($t8-$t7)*1000).'ms'."\n";$t9 = microtime(true); sort($a); $t10 = microtime(true); echo "sort排序用時:".(($t10-$t9)*1000)."ms"."\n";$t11 = microtime(true); mergeSort($a); $t12 = microtime(true); echo "歸并排序用時:".(($t12-$t11)*1000)."ms";?從時間上來看,快速排序和歸并排序在時間上比較有優(yōu)勢,但是也比不上sort排序,歸并排序比較占用內(nèi)存!
轉(zhuǎn)載于:https://www.cnblogs.com/jing1208/p/6289840.html
總結(jié)
以上是生活随笔為你收集整理的PHP的几种排序算法的比较的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP文件上传预览
- 下一篇: redis 事务,持久化,日志,主从,V