开头先说一下,学习这些排序算法其实只是学习这些算法的思路,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 insertSort($arr)
{
$len = count($arr);
for($n = 1;$n<$len;$n++){
//$n 当前元素的索引,从1开始。
$index = $n -1; //把index的值设置成当前元素索引的前一个索引值。
$temp = $arr[$n]; //把当前的元素值存进一个临时变量
while( $index >=0 && $arr[$index ] > $temp ){
//当 index 值大于等于零 并且 index 的元素值大于 当前元素值 则说明我们当前元素还可以往前移动。
$arr[$index +1] = $arr[$index]; //把 索引为 index 的元素的值赋值 给 索引为 index + 1 的元素
$index--;// index 的值再往前前进一位。
//当 index 值小于零 或者 index 的元素值 小于等于 当前元素值 则说明到头了,要跳出循环了
//如果还符合循环的条件,则继续执行循环里的逻辑
}
if($index+1!==$n){
//如果索引有移动
$arr[$index+1] = $temp;//在 index +1 的位置 存进 当前的元素值。
}
}
return $arr;
}
降序
function insertSort($arr)
{
$len = count($arr);
for($n = 1;$n<$len;$n++){
$preIndex = $n -1;
$temp = $arr[$n];
while( $preIndex >=0 && $arr[$preIndex] < $temp ){
//如果 index 值大于零 并且 当前元素大于 索引为 index 的元素的值
$arr[$preIndex+1] = $arr[$preIndex];
$preIndex--;
}
if($preIndex+1!==$n){
$arr[$preIndex+1] = $temp;
}
}
return $arr;
}