一些排序算法

<?php

function popSort(&$arr)
{
    if (empty($arr) || 1 === count($arr)) {
        return;
    }

    $len = count($arr);

    for ($i = 0; $i < $len; ++$i) {
        for ($j = 0; $j < $len - $i - 1; ++$j) {
            if ($arr[$j] > $arr[$j + 1]) {
                $tmp = $arr[$j + 1];
                $arr[$j + 1] = $arr[$j];
                $arr[$j] = $tmp;
            }
        }
    }
}

function selectSort(&$arr)
{
    if (empty($arr) || 1 === count($arr)) {
        return;
    }

    $sort = [];

    while (count($arr) > 0) {
        $minIndex = 0;
        for ($j = 0; $j < count($arr); ++$j) {
            if ($arr[$minIndex] >= $arr[$j]) {
                $minIndex = $j;
            }
        }
        $tmp = $arr[$minIndex];
        // echo $tmp, PHP_EOL;
        array_splice($arr, $minIndex, 1);
        array_push($sort, $tmp);
    }

    $arr = $sort;
}

function insertSort($arr)
{
    if (empty($arr) || 1 === count($arr)) {
        return $arr;
    }

    $len = count($arr);
    $left = [$arr[0]];

    for ($i = 1; $i < $len; ++$i) {
        $cur = $arr[$i];
        for ($j = count($left) - 1; $j >= 0; --$j) {
            if ($cur > $left[$j]) {
                array_splice($left, $j + 1, 0, $cur);
                break;
            } else {
                if (0 === $j) {
                    array_unshift($left, $cur);
                }
            }
        }
    }

    return $left;
}

function quickSort(&$arr, $left, $right)
{
    if ($left < $right) {
        $i = $left;
        $j = $right;
        $x = $arr[$left];

        while ($i < $j) {
            while ($i < $j && $arr[$j] >= $x) {
                --$j;
            }
            if ($i < $j) {
                $arr[$i++] = $arr[$j];
            }

            while ($i < $j && $arr[$i] < $x) {
                ++$i;
            }
            if ($i < $j) {
                $arr[$j--] = $arr[$i];
            }
        }
        $arr[$i] = $x;
        quickSort($arr, $left, $i - 1);
        quickSort($arr, $i + 1, $right);
    }
}

function binary_search($arr, $number)
{
    if (empty($arr)) {
        return -1;
    }
    // 初始变量值
    $len = count($arr);
    $lower = 0;
    $high = $len - 1;

    // 最低点比最高点大就退出
    while ($lower <= $high) {
        // 以中间点作为参照点比较
        $middle = floor($lower + ($high - $lower) / 2);
        // echo PHP_EOL.$middle.PHP_EOL;
        if ($arr[$middle] > $number) {
            // 查找数比参照点小,舍去右边
            $high = $middle - 1;
        } elseif ($arr[$middle] < $number) {
            // 查找树比参照点大,舍去左边
            $lower = $middle + 1;
        } else {
            return $middle;
        }
    }

    return -1;
}

// example
$arr = [4, 5, 2, 1, 9];
quickSort($arr, 0, count($arr) - 1);
echo PHP_EOL;
print_r($arr);
echo PHP_EOL;
print_r(binary_search($arr, 9));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值