寫了三種php快速排示例,第一種效率低但最簡單最容易理解,第二個是演算法導論上提供的單向一次遍歷找中值方法,第三種是雙向遍歷找中值經典快排演算法。三組演算法實現和比較如下:
方法一:該方法比較直觀,但損失了大量的空間為代價,使用了效率較低的merge函式。在三種方法中效率最低。最壞情況下演算法退化為(o(n*n))
複製** **如下:
function quick_sort($array) else
} $leftarray = quick_sort($leftarray);
$rightarray = quick_sort($rightarray);
return array_merge($leftarray, array($key), $rightarray);
}方法二:該演算法來自演算法導論,叫作nico lomuto方法(感興趣goole上有詳細說明)使用最經典的單方向一次遍歷找到中值。
但這種演算法在最壞情況下(例如值相同的陣列,需要n-1次劃分,每一次劃分需要o(n) 時間去掉乙個元素)最壞情況下為o(n*n)
複製** **如下:
function quick_sort(&$array, $start, $end)
}$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次互動的額外開銷。該題還有cjvgfmka另外兩個考點,針對死記硬背的同學:
1:中間的兩個while可否互換。當然不能互換,因為對於快盤需要乙個額外的空間儲存初始的左值,這樣左右互換的時候,先用右邊覆蓋已經儲存
為中值的左值,否則會出現問題。見這句$array[$left] = $array[$right];
2:$array[$right] = $key; 該語句含義可否省略。該句不能省略,大家可以考慮乙個極端情況比如兩個值的排序(5,2),逐步看下就明白了。
複製** **如下:
function quick_sort_swap(&$array, $start, $end)
$array[$right] = $key;
quick_sort_swap(&$array, $start, $right - 1);
quick_sort_swap(&$array, $right+1, $end);
}
本文標題: php實現快速排序的三種方法分享
本文位址: /wangluo/php/106445.html
快速排序的三種方法(遞迴)
快排 一.確定基準值有3種 選最左或者最右的那個數作為基準值 三數取中法 就是取left,mid和right三個數中中間的那個數作為基準值 取隨機值作為基基準值 二.將陣列分為兩部分比基準值小的放在左邊,比基準值大的放在右邊 1.hover法 b就是下面 的begin e是end 2.挖坑法 用圓圈...
js實現排序的三種方法
一 冒牌排序1思想 氣泡排序思想 每一次對比相鄰兩個資料的大小,小的排在前面,如果前面的資料比後面的大就交換這兩個數的位置 要實現上述規則需要用到兩層for迴圈,外層從第乙個數到倒數第二個數,內層從外層的後面乙個數到最後乙個數 2特點 排序演算法的基礎。簡單實用易於理解,缺點是比較次數多,效率較低。...
PHP爬蟲的三種方法
定義 file get contents 函式把整個檔案讀入乙個字串中。語法 file get contents path,include path,context,start,max length 引數 描述path 必需。規定要讀取的檔案。include path 可選。如果也想在 includ...