前幾天,我們通過PHP實(shí)現(xiàn)了不同的排序算法,并比較算法對(duì)應(yīng)的耗時(shí)。
【算法】PHP實(shí)現(xiàn)經(jīng)典算法(上)
下面我們來實(shí)現(xiàn)下列算法
堆排序 雞尾酒排序 直接選擇排序 計(jì)數(shù)排序$arr = [];for ($i = 0; $i < 5000; $i++) { $arr[] = rand(1, 50000);}// 5 堆排序/** * 交換兩個(gè)數(shù)的位置 * @param $a * @param $b */function swap(&$a,&$b){ $temp = $b; $b = $a; $a = $temp;}/** * 左子樹 * @param $i * @return mixed */function lchild($i){ return $i*2+1;}/** * 右子樹 * @param $i * @return mixed */function rchild($i){ return $i*2+2;}/** * 整理節(jié)點(diǎn) * @param $array 待調(diào)整的堆數(shù)組 * @param $i 待調(diào)整的數(shù)組元素的位置 * @param $heapsize 數(shù)組的長度 */function build_heap(&$array,$i,$heapsize){ $left = lchild($i); $right = rchild($i); $max = $i; //如果比左子樹小并且在左右子樹的右面,邊界調(diào)整到左側(cè) if($i < $heapsize && $left < $heapsize && $array[$left] > $array[$i] ){ $max = $left; } //如果比右子樹小并且都小于要構(gòu)建的數(shù)組長度,邊界調(diào)整到右側(cè) if($i < $heapsize && $right < $heapsize && $array[$right] > $array[$max]){ $max = $right; } //如果經(jīng)過兩次調(diào)整后,要調(diào)整的數(shù)組不是最大值 if($i != $max && $i < $heapsize && $max < $heapsize){ //就交換對(duì)應(yīng)的位置,并再次進(jìn)行整理節(jié)點(diǎn) swap($array[$i],$array[$max]); build_heap($array,$max,$heapsize); }}/** * 對(duì)堆進(jìn)行排序 * @param $array 要排序的數(shù)組 * @param $heapsize 數(shù)組的長度 */function sortHeap(&$array,$heapsize){ while($heapsize){ //長度逐步遞減0 //首先交換第一個(gè)元素和最后一個(gè)元素的位置 swap($array[0],$array[$heapsize-1]); $heapsize = $heapsize -1; build_heap($array,0,$heapsize); //整理數(shù)組的第一個(gè)的元素的位置,長度為逐步遞減的數(shù)組長度 }}/** * 創(chuàng)建堆 * @param $array * @param $heapsize */function createHeap(&$array,$heapsize){ $i = ceil($heapsize/2)-1; //找到中間的位置 for( ; $i>=0 ;$i-- ){ //從中間往前面整理堆 build_heap($array,$i,$heapsize); }}/** * 堆排序主函數(shù) */function Heapsort($array){ $heapsize = count($array); createHeap($array,$heapsize); sortHeap($array,$heapsize); return $array;}$heapsort_start_time = microtime(true);$heapsort_sort = Heapsort($arr);$heapsort_end_time = microtime(true);$heapsort_need_time = $heapsort_end_time - $heapsort_start_time;print_r('堆排序耗時(shí):' . $heapsort_need_time . '<br />');// 6 雞尾酒排序法/** * 雞尾酒排序 * @param $arr * @return mixed */function Cocktailsort($arr) { $arr_len =count($arr); for($i = 0 ; $i < ($arr_len/2) ; $i ++){ //將最小值排到隊(duì)尾 for( $j = $i ; $j < ( $arr_len - $i - 1 ) ; $j ++ ){ if($arr[$j] < $arr[$j + 1] ){ swap($arr[$j],$arr[$j + 1]); } } //將最大值排到隊(duì)頭 for($j = $arr_len - 1 - ($i + 1); $j > $i ; $j --){ if($arr[$j] > $arr[$j - 1]){ swap($arr[$j],$arr[$j - 1]); } } } return $arr;}$cocktailsort_start_time = microtime(true);$cocktailsort_sort = Cocktailsort($arr);$cocktailsortt_end_time = microtime(true);$cocktailsort_need_time = $cocktailsortt_end_time - $cocktailsort_start_time;print_r('雞尾酒排序耗時(shí):' . $cocktailsort_need_time . '<br />');// 7 希爾排序/** * 希爾排序 * @param $arr */function Shellsort($arr){ $n=count($arr); //數(shù)組長度 for($gap=floor($n/2);$gap>0;$gap=floor($gap/=2)) // { for($i=$gap;$i<$n;++$i) //根據(jù)增量循環(huán) { //以增量為步幅進(jìn)行查看 for( $j=$i-$gap; $j>=0 && $arr[$j+$gap] < $arr[$j]; $j -= $gap) { swap($arr[$j],$arr[$j+$gap]); } } } return $arr;}$shellsort_start_time = microtime(true);$shellsort_sort = Cocktailsort($arr);$shellsort_end_time = microtime(true);$shellsort_need_time = $shellsort_end_time - $shellsort_start_time;print_r('希爾排序耗時(shí):' . $shellsort_need_time . '<br />');// 8 直接選擇排序/** * 直接選擇排序 * @param $arr * @return mixed */function Straightselectsort($arr){ $n = count($arr); for($i = 0 ; $i < $n - 1;$i++){ $m = $i; for($j = $i+1 ; $j < $n; $j++){ if($arr[$j] < $arr[$m] ){ $m = $j; } if($m != $j){ //進(jìn)行交換 swap($arr[$m],$arr[$j]); } } } return $arr;}$straightselectsort_start_time = microtime(true);$straightselectsort_sort = Cocktailsort($arr);$straightselectsort_end_time = microtime(true);$straightselectsort_need_time = $straightselectsort_end_time - $straightselectsort_start_time;print_r('直接選擇排序耗時(shí):' . $straightselectsort_need_time . '<br />');// 9 計(jì)數(shù)排序/** * 計(jì)數(shù)排序 * @param $arr * @return mixed */function Countsort($arr){ $max = $arr[0]; $min = $arr[0]; foreach($arr as $key => $html' target='_blank'>value) { if ($value > $max) { $max = $value; } if ($value < $min) { $min = $value; } } //這里k的大小是要排序的數(shù)組中,元素大小的極值差+1 $c=[]; $k = $max - $min + 1; for($i = 0; $i < count($arr) ; $i ++){ $c[$arr[$i] - $min ] +=1; } for($i=1;$i < count($c); ++$i){ $c[$i] = $c[$i] + $c[$i - 1]; } for($i = count($arr);$i > 0 ; --$i){ $b[ -- $c[$arr[$i] - $min] ] = $arr[$i]; } return $b;}$countsort_start_time = microtime(true);$countsort_sort = Cocktailsort($arr);$countsort_end_time = microtime(true);$countsort_need_time = $countsort_end_time - $countsort_start_time;print_r('計(jì)數(shù)排序耗時(shí):' . $countsort_need_time . '<br />');
堆排序耗時(shí):0.086709976196289
雞尾酒排序耗時(shí):4.6467659473419
希爾排序耗時(shí):4.4215688705444
直接選擇排序耗時(shí):4.529422044754
計(jì)數(shù)排序耗時(shí):4.2601070404053
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。
新聞熱點(diǎn)
疑難解答
圖片精選