排序算法

前段时间收集了一些排序算法,并且通过自己的方式实现这些算法,下面直接展示各种算法

排序方法类

个人习惯比较喜欢直接写成类的方式,可能是受到Java影响,比较喜欢将同类型方法集合到类中,也比较方便方法调用,有问题的话欢迎来评论区评论

<?php

namespace Sort;

/**
 * Class Sort
 * @package Sort
 * 对一维数组进行排序
 */
class Sort
{

    /**
     * 选择排序
     * 在要排序的一组数中,选出最小的一个数与第一个位置的数交换。然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
     * @param array $arr
     * @return array
     */
    public static function selectSort(array $arr)
    {
        $len = count($arr);
        for ($i = 0;$i< $len -1;$i++)
        {
            $p = $i;
            for ($j = $i+1;$j<$len;$j++)
            {
                if( $arr[$j] < $arr[$p] )
                {
                    $p = $j;
                }
            }
            if( $i != $p )
            {
                $temp = $arr [$p];
                $arr[$p] = $arr[$i];
                $arr[$i] = $temp;
            }
        }
        return $arr;
    }
    /**
     * 快速排序
     * 假设有数组已经排好序,现插入一个元素,从数组末尾开始比较,直至找到合适的位置插入数组
     * @param array $arr
     * @return array
     */
    public static function insertSort(array $arr)
    {
        $len = count($arr);
        for ($i = 1;$i<$len;$i++)
        {
            $temp = $arr[$i];
            $j = $i-1;
            while($j>=0 && $temp > $arr[$j])
            {
                $arr[$j+1] = $arr[$j--];
            }
            $arr[$j+1] = $temp;
        }
        return $arr;
    }
    /**
     * 冒泡排序算法
     * @param Array $array 需要排序的一维数组
     * @param Boolean $flag  true 升序 false 降序
     * @return Array Or -1
     */
    public static function bubbleSort(Array $array, bool $flag = true)
    {
        if( !self::_isSingleDimensionArray($array) )
        {
            return -1;
        }
        $len = count($array);
        for ( $i = 0; $i < $len; $i ++ )
        {
            for ($j = $i; $j < $len; $j ++ )
            {
                if( self::_compare($array[$i],$array[$j],$flag) )
                {
                    $temp = $array [$i];
                    $array[$i] = $array[$j];
                    $array[$j] = $temp;
                }
            }
        }
        return $array;
    }

    /**
     * 改进冒泡排序算法,在一定的情况下,会减少比较次数
     * 优点:一定条件是指,在排序进行到一定次数时,数据排序已完成,不在需要继续进行比较
     * 缺点:多了一步 判断,当有一个完全紊乱的数组时,耗费时间相对较长
     * @param Array $array 需要排序的一维数组
     * @param Boolean $flag  true 顺序 false 倒序
     * @return Array Or -1
     */
    public static function optimizeBubbleSort(Array $array, bool $flag = true)
    {
        if( !self::_isSingleDimensionArray($array) )
        {
            return -1;
        }
        $len = count($array);
        for ( $i = 0; $i < $len; $i ++ )
        {
            $tag = false;
            for ($j = $i; $j < $len; $j ++ )
            {
                if( self::_compare($array[$i],$array[$j],$flag) )
                {
                    $tag = true;
                    $temp = $array [$i];
                    $array[$i] = $array[$j];
                    $array[$j] = $temp;
                }
            }
            if( !$tag )
            {
                break;
            }
        }

        return $array;
    }

    /**
     * 快速排序
     * @param Array $array 需要排序的一维数组
     * @param Boolean $flag  true 顺序 false 倒序
     * @return Array Or -1
     */
    public static function quickSort(Array $array, bool $flag = true)
    {
        if( !self::_isSingleDimensionArray($array) )
        {
            return -1;
        }

        $len = count($array);
        if( $len <= 1)
        {
            return $array;
        }
        $left_array = [];
        $right_array = [];

        for ($i=1;$i<$len;$i++)
        {
            if( self::_compare($array[0],$array[$i],$flag) )
            {
                array_push($left_array,$array[$i]);
            } else {
                array_push($right_array,$array[$i]);
            }
        }

        $left_array = self::quickSort($left_array,$flag);
        $right_array = self::quickSort($right_array,$flag);

        return array_merge($left_array,[$array[0]],$right_array);

    }

    /**
     * 判断数组是否为一维数组
     * @v1.0
     * @param Array $array 变量
     * @return Boolean true Or false
     */
    private static function _isSingleDimensionArray(Array $array)
    {
        return count($array) == count($array, 1);
    }

    /**
     * 比较大小
     * @v1.0
     * @param Number $val1 需要比较的数值
     * @param Number $val2 需要比较的数值
     * @param Boolean $flag 标识 true '>', false '<'
     * @return Boolean true Or false
     */
    private static function _compare($val1,$val2,$flag)
    {
        return $flag ? $val1>=$val2 : $val1<$val2;
    }
}

最近开始有意识的去收集看到的各种算法,并且已上传到码云上,有兴趣的可以下载来看看,地址:git@gitee.com:zhao_wei_cai/algorithm.git
注释:
本文部分借鉴了 Raylove 的文章,原文地址:https://www.cnblogs.com/a609251438/p/11845846.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值