开头先说一下,学习这些排序算法其实只是学习这些算法的思路,PHP开发的时候最好用PHP内置的排序函数,因为PHP内置的排序函数是底层代码实现的,比我们自己用PHP手动写的函数速度快得多得多。
我们用来排序的数组必须是符合
- 数组开始索引是明确的,一般是0。
- 数组索引的必须是连续的整型或者数字字符串或者两者混合。
比如:
//连续的数字字符串索引数组
$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;
}