常用算法的php实现

冒泡算法

<?php
function bubble_sort($array)
{
    $len = count($array);
    $swag = false;
    
    for ($j = 0; $j < $len; $i++) {
        for ($j = 1; $j < $len - $i; $j++) {
            if ($array[$j-1] > $array[$j]) {
                [$array[$j-1], $array[$j]] = [$array[$j], $array[$j-1]];
                $swag = true;
            }
        }

        if ($swag === false) {    //判断上次循环是否有交换,没有交互说明已经有序,就不用循环了
            break;
        }
    }

    return $array;
}

归并排序

<?php
function merge_sort($a)
{
    $n = count($arr);
    return merge_sort_c($a, 0, $n-1);
}

function merge_sort_c($a, $left, $right)
{
    if ($left >= $right) {
        return [$a[$right]];    //递归退出条件,获取return [$a[$left]];
    }

    $mid = floor(($left + $right) / 2);
    $left = merge_sort_c($a, $left, $mid);
    $right = merge_sort_c($a, $mid+1, $right);
    
    return merge($left, $right);
}

function merge($left, $right)
{
    $i = 0; $j = 0;
    $tmp = [];

    while (isset($left[$i]) && isset($right[$j])) {
        If ($left[$i] < $right[$j]) {
            $tmp[] = $left[$i];
            $i++;
        } else {
            $tmp[] = $right[$j];
            $j++;
        }
    }
    
    while (isset($left[$i]) {
        $tmp[] = $left[$i];
        $i++;
    }
    
    while (isset($right[$j])) {
        $tmp[] = $right[$j];
        $j++;
    }

    return $tmp;
}

快速排序

<?php

function quick_sort($a)
{
    quick_sort_c($a, 0, $n1);
}

function quick_sort_c(&$a, $left, $right)
{
    if ($left >= $right) {
        return;
    }

    $partition = partition($a, $left, $right);

    quick_sort_c($a, $left, $partition-1);
    quick_sort_c($a, $partition+1, $right);
}

function partition(&$a, $left, $right)
{
    $p = $a[$right];
    $j = $left;
    for ($i = $left; $i < $right; $i++) {
        If ($a[$i] < $p) {
            [$a[j], $a[$i]] = [$a[$i], $a[$j]];
            $j++;
        }
    }
    
    [$a[$j], $a[$right]] = [$a[$right], $a[$j]];
    
    return $j;
}

二分查找

<?php

function binary_search($a, $v)
{
    $n = count($a);
    
    return binary_search_c($a, 0, $n - 1, $v);
}

//递归实现
function binary_search_c($a, $low, $hight, $v)
{
    If ($low > $hight) {
        return false;
    }
    
    $mid = floor(($low + $hight) / 2);
    if ($a[$mid] > $v) {
        return binary_search_c($a, $mid + 1, $hight, $v);
    } else if ($a[$mid] < $v) {
        return binary_search_c($a, $low, $mid - 1, $v);
    } else {
        return $mid;
    }
}

function binary_search_u($a, $v)
{
    $low = 0;
    $hight = count($a);
    If ($hight == 0) {
        return -1;
    }

    while ($low <= $hight) {
        $mid = floor(($low + $hight) / 2);
        If ($a[$mid] > $v) {
            $hight = $mid - 1;
        } else if ($a[$mid] < $v) {
            $low = $mid + 1;
        } else {
            return $mid;
        }    
    }
    
    return -1;
}

发布了2 篇原创文章 · 获赞 0 · 访问量 13

猜你喜欢

转载自blog.csdn.net/vecray/article/details/105055097
今日推荐