PHP实现常见排序

下面是有php实现的几种排序,有一次面试的时候也碰到过,在此写下,方便以后使用:

header('Content-type:text/html;charset=utf-8');

define('MAXNUM', 10);

$arr = array();

echo '排序之前:<br/>';
for ($i = 0; $i < MAXNUM; $i++) {
    echo ($arr[] = rand(0, 100)) . '&nbsp;&nbsp;&nbsp;';
}

selSort($arr);
insertSort($arr);
bubSort($arr);
shakerSort($arr);
echo '<br/><br/>快速排序:<br/>';
$quickSortRes = quickSort($arr);
for ($k = 0; $k < MAXNUM; $k++) {
    echo $quickSortRes[$k] . '&nbsp;&nbsp;&nbsp;';
}

function selSort($arr)
{
    echo '<br/><br/>选择排序:';
    for ($i = 0; $i < MAXNUM - 1; $i++) {
        $m = $i;
        for ($j = $i + 1; $j < MAXNUM; $j++) {
            $arr[$m] > $arr[$j] && $m = $j;
        }

        $m != $i && swap($arr[$i], $arr[$m]);

        echo '<br/>第'. ($i + 1) . '次排序结果:';
        for ($k = 0; $k < MAXNUM; $k++) {
            echo $arr[$k] . '&nbsp;&nbsp;&nbsp;';
        }
    }
}

function insertSort($arr)
{
    echo '<br/><br/>插入排序:';
    for ($j = 1; $j < MAXNUM; $j++) {
        $t = $arr[$j];
        //for ($i = $j - 1; $i > -1; $i--) {
        //    if ($t > $arr[$i]) {
        //        $arr[$i + 1] = $t;
        //        break;
        //    }else{
        //        $arr[$i + 1] = $arr[$i];
        //        $arr[$i] = $t;
        //    }
        //}
        $i = $j - 1;
        while ($t < $arr[$i]) {
            $arr[$i + 1] = $arr[$i];
            $i --;
            if ($i < 0) break;
        }

        $arr[$i + 1] = $t;

        echo '<br/>第'. $j . '次排序结果:';
        for ($k = 0; $k < MAXNUM; $k++) {
            echo $arr[$k] . '&nbsp;&nbsp;&nbsp;';
        }
    }
}

function bubSort($arr)
{
    echo '<br/><br/>冒泡排序:';
    $flag = 1;
    for ($i = 0; $i < MAXNUM - 1 && $flag == 1; $i++) {
        $flag = 0;
        for ($j = 0; $j < MAXNUM - $i - 1; $j++) {
            if ($arr[$j + 1] < $arr[$j]) {
                swap($arr[$j + 1], $arr[$j]);
                $flag = 1;
            }
        }

        echo '<br/>第'. ($i + 1) . '次排序结果:';
        for ($k = 0; $k < MAXNUM; $k++) {
            echo $arr[$k] . '&nbsp;&nbsp;&nbsp;';
        }
    }
}

function shakerSort($arr)
{
    echo '<br/><br/>Shaker排序(双向冒泡排序):';
    $left = $shift = $num = 0;
    $right = MAXNUM - 1;
    while ($left < $right) {
        for ($i = 0; $i < $right; $i++) {
            if ($arr[$i] > $arr[$i + 1]) {
                swap($arr[$i], $arr[$i + 1]);
                $shift = $i;
            }
        }
        $right = $shift;

        for ($j = $right; $j > $left; $j--) {
            if ($arr[$j - 1] > $arr[$j]) {
                swap($arr[$j - 1], $arr[$j]);
                $shift = $j;
            }
        }
        $left = $shift;

        echo '<br/>第'. (++$num) . '次排序结果:';
        for ($k = 0; $k < MAXNUM; $k++) {
            echo $arr[$k] . '&nbsp;&nbsp;&nbsp;';
        }
    }
}

function quickSort($arr)
{
    if (count($arr) <= 1) return $arr;
    $key = $arr[0];
    $left_arr = array();
    $right_arr = array();
    for ($i = 1; $i < count($arr); $i++) {
        if ($arr[$i] <= $key) $left_arr[] = $arr[$i]; 
        else   $right_arr[] = $arr[$i];
    }
    $left_arr = quickSort($left_arr);
    $right_arr = quickSort($right_arr);
    return array_merge($left_arr, array($key), $right_arr);
}

function swap(&$a, &$b)
{
    $t = $a;
    $a = $b;
    $b = $t;
}

 

你可能感兴趣的:(冒泡排序,插入排序,快速排序,选择排序)