一、冒泡排序
每次把当前数组剩余数中最大或最小的数(取决于排序方式)放在靠右的位置,经过数组元素个数减1次后,就可以得到排序结果。
例:
function maopaoSort($arr)
{
$count = count($arr);
//循环 $count-1 次
for ($i = 0; $i < $count - 1; $i++) {
//每次要比较 $count-1-$i 次
for ($j = 0; $j < $count - 1 - $i; $j++) {
//如果前一个数字大于后一个数字,两者对调
if ($arr[$j] > $arr[$j + 1]) {
list($arr[$j], $arr[$j + 1]) = [$arr[$j + 1], $arr[$j]];
}
}
}
print_r($arr);
}
//要排序的数组信息
$sort_arr = [1, 5, 3, 2, 4];
maopaoSort($sort_arr);
结果:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
二、选择排序
每次把当前数组剩余数中最大或最小的数(取决于排序方式)放在当前元素所在位置进行替换,经过数组元素个数减1次后,就可以得到排序结果。
例:
function xuanzeSort($arr)
{
$count = count($arr);
//循环 $count-1 次,因为只要前面都确定了,最后一个就确定了
for ($i = 0; $i < $count - 1; $i++) {
$min_val = $arr[$i]; //最小值初始化
$min_key = $i; //最小值key初始化
//每次要比较 $count-1-$i 次
for ($j = 0; $j < $count - 1 - $i; $j++) {
//如果前一个数字大于后一个数字,则更新最小值和最小值key
if ($min_val > $arr[$j+$i+1]) {
$min_val = $arr[$j+$i+1];
$min_key = $j+$i+1;
}
}
//当前值和最小值位置对调
if($i != $min_key){
list($arr[$i],$arr[$min_key]) = [$arr[$min_key],$arr[$i]];
}
}
print_r($arr);
}
$sort_arr = [1, 5, 3, 2, 4];
xuanzeSort($sort_arr);
结果:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
三、插入排序
每次把当前元素,与前面排好序的数组进行比较,插入到合适的位置,使其生成一个新的排好序的数组,经过数组元素个数减1次后,就可以得到排序结果。
例:
function charuSort($arr)
{
$count = count($arr);
//循环 $count-1 次,因为第一个代表已经排好序了,所以从第二开始
for ($i = 1; $i < $count; $i++) {
$insert_val = $arr[$i]; //要插入的值
$insert_key = $i-1; //要插入的key初始化
//当要插入的值比排好序的值小,则排好序的值索引向后偏移一位
while ($insert_key>=0 && $insert_val<$arr[$insert_key]){
$arr[$insert_key+1] = $arr[$insert_key];
$insert_key--;
}
//当要插入的值比排好序的值相等或大于时,则要插入的值所在的位置就是空出来的索引值
$arr[$insert_key+1] = $insert_val;
}
print_r($arr);
}
$sort_arr = [1, 5, 3, 2, 4];
charuSort($sort_arr);
结果:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
四、快速排序
将数组的第一个元素作为参照,比他大的放右边数组,比他小的放左边数组,然后再把左右边数组重复这样的操作,直到数组元素小于等于1位置,最后把结果进行合并,得出排序结果。
例:
function kuaisuSort($arr)
{
//先判断是否需要继续进行
$length = count($arr);
if ($length <= 1) {
return $arr;
}
//如果没有返回,说明数组内的元素个数 多余1个,需要排序
//选择一个标尺
//选择第一个元素
$base_num = $arr[0];
//遍历 除了标尺外的所有元素,按照大小关系放入两个数组内
//初始化两个数组
$left_array = array();//小于标尺的
$right_array = array();//大于标尺的
for ($i = 1; $i < $length; $i++) {
if ($base_num > $arr[$i]) {
//放入左边数组
$left_array[] = $arr[$i];
} else {
//放入右边数组
$right_array[] = $arr[$i];
}
}
//再分别对 左边 和 右边的数组进行相同的排序处理方式
//递归调用这个函数,并记录结果
$left_array = kuaisuSort($left_array);
$right_array = kuaisuSort($right_array);
//合并左边 标尺 右边
return array_merge($left_array, array($base_num), $right_array);
}
$sort_arr = [1, 5, 3, 2, 4];
print_r(kuaisuSort($sort_arr));
结果:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)