php實現快速排序的三種方法分享

2022-10-06 12:30:11 字數 1632 閱讀 1588

寫了三種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...