PHP快速排序演算法

2021-07-06 10:58:01 字數 1567 閱讀 1319

看了c語言版本的快速排序後,我用php實現了一遍。

難度在於在乙個陣列上面進行位置的交換理解

一列很長很長很長的隊伍,我要排序,先抽乙個隊長,然後以隊長為準,比隊長高的排隊長右邊,比隊長矮的排隊長左邊。 然後以隊長為中界分成兩個小分隊。 各小分隊又抽乙個小隊長 這個小隊長又按照大隊長的做法做了一遍……..

取第乙個位置的數值用$key變數臨時儲存起來。

分別再用$i ,$j 變數儲存起數值的開始和結束位置。($start,$end是固定的位置,下面用到的是變動的位置)

從右邊開始迴圈尋找,比$key小的數值賦值到$i位置(也就是$key的原本的位置,那個比$key小的位置變成的髒值),如果不符合條件的每找乙個位置$j遞減。

從左邊開始迴圈尋找,比$key大的數值或等於$key的賦值到那個比$key小的位置,如果不符合條件的每找乙個位置$i遞增。(這相當兩個參考於$key的大小值,進行了對換,那如果這亂的陣列只有3個數值的時候,那不相當於排序?當然現在 那個比$key大的位置也變成的髒值,繼續像第四步那樣重複做一遍。)

當迴圈的位置$i,$j靠近(有些老師說是中間位置,其實是不對的,應該說兩位置靠近。)的時候,還剩乙個含有髒值的$i位置,就把$\key賦值到\$i位置。為什麼要賦值到\$i位置?看列表下面解析。

大小數值由$key做參考分成了兩邊,即使是兩邊,但兩邊還是亂的,再把這兩邊的數列遞迴。(像從第一步開始重做一遍)

一直遞迴這樣的操作,直到開始位置大於或等於結束位置,陣列就排序完了。

問題:兩邊位置縮小成 左邊位置無法大於右邊位置時,也就是相鄰的兩個位置,那為什麼$key最終用左邊$i的位置?

答案:因為那個位置,從一開始就是$key的讓出來的位置,所以最後沒人認領的位置應該留給$key,這樣陣列才不多不少。

<?php

$testarray = array();

for ($i=0; $i

< 100; $i++)

echo

'';print_r($testarray);

echo

'

';

recursive(0, 99);

echo

'

';

print_r($testarray);

echo

'

';

function

recursive

($start, $end)

$i = $start;

$j = $end;

$key = $testarray[$start];

while( $j > $i )

$testarray[$i] = $testarray[$j];

while( $j > $i && $key >= $testarray[$i] )

$testarray[$j] = $testarray[$i];

}$testarray[$i] = $key;

recursive($start, $i-1);

recursive($i+1, $end);

}

php 快速排序演算法,PHP 快速排序演算法

概念 快速排序演算法是對冒泡演算法的乙個優化。他的思想是先對陣列進行分割,把大的元素數值放到乙個臨時陣列裡,把小的元素數值放到另乙個臨時陣列裡 這個分割的點可以是陣列中的任意乙個元素值,一般用第乙個元素,即 array 0 然後繼續把這兩個臨時陣列重複上面拆分,最後把小的陣列元素和大的陣列元素合併起...

php 快速排序演算法,php 快速排序函式

在php程式設計中會用到一些常用的演算法,把這些演算法 寫成函式方便以後呼叫 php快速排序函式就這樣誕生了,兩個版本,遞迴和無遞迴。可以根據實際需要選用。qsort 資料快速排序遞迴版 array to sort 需要排序的陣列 排序過程中,陣列的鍵會被替換為數字索引的鍵 如果 array to ...

PHP快速排序演算法

快速排序使用分治策略來把待排序資料序列分為兩個子串行,具體步驟為 1 從數列中挑出乙個元素,稱該元素為 基準 2 掃瞄一遍數列,將所有比 基準 小的元素排在基準前面,所有比 基準 大的元素排在基準後面。3 通過遞迴,將各子串行劃分為更小的序列,直到把小於基準值元素的子數列和大於基準值元素的子數列排序...