国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

PHP實現快速排序

2019-11-08 01:44:34
字體:
來源:轉載
供稿:網友

寫了三種php快速排示例: 第一種效率低但最簡單最容易理解, 第二個是算法導論上提供的單向一次遍歷找中值方法, 第三種是雙向遍歷找中值經典快排算法。 三組算法實現和比較如下:

方法一:該方法比較直觀,但損失了大量的空間為代價,使用了效率較低的merge函數。在三種方法中效率最低。最壞情況下算法退化為(O(n*n))

function quick_sort($array) { if(count($array) <= 1) { return $array; } $key = $array[0]; $rightArray = array(); $leftArray = array(); for($i = 1; $i < count($array); $i++) { if($array[$i] >= $key) { $rightArray[] = $array[$i]; } else { $leftArray[] = $array[$i]; } } $leftArray = quick_sort($leftArray); $rightArray = quick_sort($rightArray); return array_merge($leftArray, array($key), $rightArray);}

方法二:該算法來自算法導論,叫作Nico Lomuto方法(感興趣Google上有詳細說明)使用最經典的單方向一次遍歷找到中值。 但這種算法在最壞情況下(例如值相同的數組,需要n-1次劃分,每一次劃分需要O(n) 時間去掉一個元素)最壞情況下為O(n*n)

function quick_sort(&$array, $start, $end) { if ($start >= $end) return; $mid = $start; for ($i = $start + 1; $i <= $end; $i++) { if ($array[$i] < $array[$mid]) { $mid++; $tmp = $array[$i]; $array[$i] = $array[$mid]; $array[$mid] = $tmp; } } $tmp = $array[$start]; $array[$start] = $array[$mid]; $array[$mid] = $tmp; quick_sort($array, $start, $mid - 1); quick_sort($array, $mid + 1, $end);}

方法三:該方法基本上是教科書式的常見寫法,首先從左向右遍歷小于中間元素的跳過,同時從右向左遍歷遇到大的元素跳過,然后如果沒有交叉則交換兩邊值,繼續循環,直到找到中間點。 注意該方法在處理相同元素的時候,仍舊交換,這樣在最壞情況下也有O(nlogn)效率。但下面的函數中,如果將$array[$right] > $key 改成 $array[$right] >=$key 或將 $array[$left] < $key改成$array[$left] <= $key則最壞情況不但會墮落為O(n*n).而且除了每次比較的消耗外,還會產生n次交互的額外開銷。該題還有另外兩個考點,針對死記硬背的同學:

中間的兩個while可否互換。當然不能互換,因為對于快盤需要一個額外的空間保存初始的左值,這樣左右互換的時候,先用右邊覆蓋已經保存 為中值的左值,否則會出現問題。見這句$array[$left] = $array[$right];$array[$right] = $key; 該語句含義可否省略。該句不能省略,大家可以考慮一個極端情況比如兩個值的排序(5,2),逐步看下就明白了。function quick_sort_swap(&$array, $start, $end) { if($end <= $start) { return; } $key = $array[$start]; $left = $start; $right = $end; while($left < $right) { while($left < $right && $array[$right] > $key){ $right--; } $array[$left] = $array[$right]; while($left < $right && $array[$left] < $key){ $left++; } $array[$right] = $array[$left]; } $array[$right] = $key; quick_sort_swap($array, $start, $right - 1); quick_sort_swap($array, $right+1, $end);}

原文鏈接:php實現快速排序的三種方法分享


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永胜县| 胶州市| 天等县| 唐海县| 襄汾县| 利辛县| 浦城县| 金溪县| 密山市| 仙居县| 左云县| 宿松县| 赞皇县| 招远市| 湖南省| 循化| 海兴县| 固原市| 聂拉木县| 右玉县| 桑日县| 观塘区| 新蔡县| 土默特右旗| 明溪县| 潢川县| 大化| 呼图壁县| 沙湾县| 江西省| 公主岭市| 津南区| 汉沽区| 临颍县| 扶余县| 赣州市| 哈尔滨市| 龙里县| 尚志市| 宁强县| 深州市|