<?php
error_reporting ( 'E_ALL' );
/*
* 快排
*/
function qSort(&$arr, $left, $right) {
if ($left < $right) {
// $position = patition ( $arr, $left, $right );
$position = wPatition ( $arr, $left, $right );
qSort ( $arr, $left, $position - 1 );
qSort ( $arr, $position + 1, $right );
}
}
/*
* 分治(for)
*/
function patition(&$arr, $left, $right) {
static $count = 0; // 分治次数
$count ++;
while ( $left < $right ) {
$key = $arr [$left]; // 以 $left 为标志位
$temp = $arr;
// 从右往左 找小值
for(; $right > $left; $right --) {
if ($key > $arr [$right]) { // 找到 比 $key 标志值 小的值,准备交换这个小值 到 标志位 位置
break;
}
}
$arr [$left] = $arr [$right]; // 交换这个小值 到 标志位 位置
$temp [$left] = "<b><font color='red'>{$arr[$left]}</font></b>";
// 从左往右 找大值
for(; $left < $right; $left ++) {
if ($key < $arr [$left]) {
break;
}
}
$arr [$right] = $arr [$left]; // 交换大值到 小值的位置上
$arr [$left] = $key;
$temp [$right] = "<b><font color='purple'>{$arr[$right]}</font></b>";
$temp [$left] = "<b><font color='blue'>{$arr[$left]}</font></b>";
echo "<b>第{$count}次分治,关键字[$key]:</b>" . implode ( "\t", $temp ) . '<br />';
unset ( $temp );
}
return $left;
}
/*
* 分治(while)
*/
function wPatition(&$arr, $left, $right) {
$key = $arr [$left];
while ( $left < $right ) {
while ($left<$right && $key < $arr [$right] ) {
$right --;
}
if ($left<$right) {
$arr [$left] = $arr [$right];
$left ++;
}
while ($left<$right && $key > $arr [$left] ) {
$left ++;
}
if ($left<$right) {
$arr [$right] = $arr [$left];
$right --;
}
}
$arr [$left] = $key;
return $left;
}
$left = 0;
$right = 9;
$arr = array ();
for($i = $left; $i <= $right; $i ++) {
$arr [$i] = rand ( 0, 10 );
}
echo implode ( "\t", $arr ) . '<br />';
qSort ( $arr, $left, $right );
var_dump ( $arr );
?>