php 實現快速排序算法:
第一種:
1. 選取第一個元素爲基數,分別從右(high)往左(high--)查找,找到一個比基數小的數,進行位置交換, 直到 low == high,結束一次排序;然後從 左 往右查找,找到一個比基數大的數,進行位置交換,直到 low == high,結束一次排序;最後將基數 放到 low 位置上。
2. 此時的 low 值代表一次排序後 基數所在的數組下標位置。
3. 通過遞歸進行 左右子數組排序,直到 low == high
代碼如下:
$arr = [49,38,65,97,76,13,27,49];
function partition(&$arr, $low, $high)
{
//$low = 0;
//$high = count($arr) - 1;
$base = $arr[$low];
while($high > $low) {
while($low < $high && $arr[$high] >= $base)
{
$high--;
}
$arr[$low] = $arr[$high];
while($low < $high && $arr[$low] <= $base)
{
$low++;
}
$arr[$high] = $arr[$low];
}
$arr[$low] = $base;
return $low;
}
function quickSort(&$arr, $low, $high)
{
if ($high > $low) {
$pt = partition($arr, $low, $high);
quickSort($arr, $low, $pt-1);
quickSort($arr, $pt+1, $high);
}
}
quickSort($arr, 0, count($arr)-1);
print_r($arr);
第二種:
下面的排序,是使用到了PHP自帶的 array_merge() 數組合並函數,並且通過循環遍歷,每次都需要申請內存。
function quickSort1($arr)
{
$len = count($arr);
if ($len <= 1) {
return $arr;
}
$v = $arr[0];
$low = $up = array();
for ($i = 1; $i < $len; ++$i) {
if ($arr[$i] > $v) {
$up[] = $arr[$i];
} else {
$low[] = $arr[$i];
}
}
$low = quickSort($low);
$up = quickSort($up);
$b = array_merge($low, array($v), $up);
//print_r($b)."\n";
return $b;
}
$a = [6,1,3,2,8,5,9];
var_dump(quickSort($a));
待更。。。。
快排算法的應用:
1. 求無序數組中中位數
改變第一種方法裏的 quickSort方法:
function quickSortMid(&$arr, $low, $high)
{
$size = count($arr);
$mid = ceil(($size-1) / 2); // 當size爲偶數時,向上取整。因爲當pt 大於 mid時,中位數一定在左邊數組,當等於時,中位數也一定包含在數組中
if ($high > $low) {
$pt = partition($arr, $low, $high);
if ($pt > $mid) {
quickSort($arr, $low, $pt-1);
}
if ($pt < $mid) {
quickSort($arr, $pt+1, $high);
}
if ($pt == $mid) {
$high = $low;
}
}
}
2. 求無序數組的第 k 大數