快速排序--PHP版本

<?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 );

?>

 

posted @ 2014-04-04 16:59  goobeer  阅读(208)  评论(0编辑  收藏  举报