PHP 实现选择排序(Select sort)

开头先说一下,学习这些排序算法其实只是学习这些算法的思路,PHP开发的时候最好用PHP内置的排序函数,因为PHP内置的排序函数是底层代码实现的,比我们自己用PHP手动写的函数速度快得多得

我们用来排序的数组必须是符合

  1. 数组开始索引是明确的,一般是0。
  2. 数组索引的必须是连续的整型或者数字字符串或者两者混合。

比如:

//连续的数字字符串索引数组

$arr = [
    '0' => 3,
    '1' => 2,
    '2' => 4,
];


//连续的数字索引数组


$arr = [
    0 => 3,
    1 => 2,
    2 => 4,
];


//混合索引,数字和数字字符串都有


$arr = [
    '0' => 7,
    1 => 3,
    '2' => 2,
    3 => 4,
    '4'=> 6,
];



//这种字符串索引数组是不行的

$arr = [
    'a' => 3,
    'b' => 2,
    'c' => 4,
];

//这种不连续索引数组也是不行的

$arr = [
    0 => 3,
    2 => 2,
    3 => 4,
];

 原理:大致讲下,以升序为例,假设最小值的索引,找最小值的索引,把最小值和假设的最小值的索引的值进行交换,按这样的逻辑重复查找下去。

 

PHP实现选择排序

升序版

function selectSort($arr)
{
    for($len = count($arr),$n=0;$n<$len -1;$n++)
    {
        $minIndex = $n; 

        for($m = $n+1 ;$m< $len;$m++)
        {
            if($arr[$minIndex] > $arr[$m]){
                $minIndex = $m; 
            }
        }

        if($minIndex !== $n){
            $temp = $arr[$minIndex];
            $arr[$minIndex]  = $arr[$n];
            $arr[$n] = $temp;
        }


    }

    return $arr;
}

 

降序版

从前往后,找最大索引

function selectSort($arr)
{
    for($len = count($arr),$n=0;$n<$len -1;$n++)
    {
        $maxIndex = $n ;

        for($m = $n+1 ;$m< $len;$m++)
        {
            if($arr[$maxIndex] < $arr[$m]){
                $maxIndex = $m;
            }
        }

        if($maxIndex !== $n){
            $temp = $arr[$maxIndex];
            $arr[$maxIndex]  = $arr[$n];
            $arr[$n] = $temp;
        }


    }

    return $arr;
}

从后往前,找最小索引

function selectSort($arr)
{
    for($len = count($arr),$n=0;$n<$len -1;$n++)
    {
        $minIndex = $len - 1 - $n;

        for($m = 0 ;$m< $len -$n;$m++)
        {
            if($arr[$minIndex] > $arr[$m]){
                $minIndex = $m;
            }
        }

        if($minIndex !== $len - 1 - $n){
            //$len - 1 - $n 的值可以赋值给一个变量,这样不用计算这么多次。
            $temp = $arr[$minIndex];
            $arr[$minIndex]  = $arr[$len - 1 - $n];
            $arr[$len - 1 - $n] = $temp;
        }


    }

    return $arr;
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值