插入排序
<?php
//插入排序
function insertSort($arr)
{
//区分哪部分是已经排序好的
//哪部分是没有排序的
//找到其中一个需要排序的元素
//这个元素就是从第二个元素开始,到最后一个元素都是这个需要排序的元素
//利用循环就可以标志出来
//i循环控制,每次需要插入的元素,一旦需要插入的元素控制好了,
//间接已经将数组分成了2部分,下标小于当前的(左边的),是排序好的序列
$len = count($arr);
for ($i = 1; $i < $len; $i++)
{
//获得当前需要比较的元素值
$tmp = $arr[$i];
//内层循环控制比较并插入
for ($j = $i-1; $j >= 0; $j--)
{
//$arr[$j],需要插入的元素,$arr[$j],需要比较的元素
if ($tmp < $arr[$j])
{
//发现插入的元素要小,互换位置
//将后边的元素与前面的元素交换
$arr[$j+1] = $arr[$j];
//将前面的数设置为当前需要交换的数
$arr[$j] = $tmp;
}
else
{
//如果碰到不需要移动的元素
//由于是已经排序好的数组,则前面的就不需要再次比较了
break;
}
}
}
//将这个元素插入到已经排序好的序列内
//返回
return $arr;
}
$sortArr = [1, 2, 3, 4, 10, 11, 34, 56, 12, 23, 98, 5];
echo '<pre>';
var_dump(insertSort($sortArr));
二分查找
<?php
/**
* 二分查找(Binary Search)算法,也叫折半查找算法。二分查找的思想非常简单,有点类似分治的思想。
* 二分查找针对的是一个有序的数据集合,每次都通过跟区间的中间元素对比,
* 将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。
*
* 循环写法
* @param array $array 待查找的数组
* @param int $findVal 要查找的值
* @return int 返回找到的数组键
*/
function binarySearch(array $array, int $findVal)
{
// 非数组或者数组为空,直接返回-1
if (empty($array)) {
return -1;
}
// 查找区间,起点和终点
$start = 0;
$end = count($array) - 1;
while ($start <= $end)
{
// 以中间点作为参照点比较,取整数
$middle = intval(($start + $end) / 2);
if ($array[$middle] > $findVal)
{
// 查找数比参照点小,则要查找的数在左半边
// 因为 $middle 已经比较过了,这里需要减1
$end = $middle - 1;
}
elseif ($array[$middle] < $findVal)
{
// 查找数比参照点大,则要查找的数在右半边
// 因为 $middle 已经比较过了,这里需要加1
$start = $middle + 1;
}
else
{
// 查找数与参照点相等,则找到返回
return $middle;
}
}
// 未找到,返回-1
return -1;
}
// 调用
$array = [10,12,16,19,20,34,56,78,84,95,100];
echo binarySearch($array, 84);
冒泡排序
<?php
//冒泡排序
function bubbleSorting($sortArr)
{
$count = count($sortArr);
if($count <= 0) return false;//如果数组是空的,返回错误
//第一层循环
for ($i = 0; $i < $count-1; $i++)
{
//第二层循环
for($j = 0; $j < $count-$i-1; $j++)
{
//当前值大于后面的值,就将后面的值挪前面去,前面的值挪后面去,(从小到大排)
if ($sortArr[$j] > $sortArr[$j+1])
{
$temp = $sortArr[$j];
$sortArr[$j] = $sortArr[$j+1];
$sortArr[$j+1] = $temp;
}
}
}
echo "<pre>";
var_dump($sortArr);
}
$sortArr = [1, 2, 3, 4, 10, 11, 34, 56, 12, 23, 98, 5];
bubbleSorting($sortArr);
快速排序
<?php
//快速排序
function quickSort($array)
{
//只有一个元素,直接返回
$count = count($array);
if($count <= 1) return $array;
//获取第一个元素,作为比较值
$key = $array[0];
$left_arr = [];
$right_arr = [];
//从第二个元素开始进行比较,小于第一个元素的,放左边数组,大于第一个元素的放右边数据
for ($i = 1; $i < $count; $i++)
{
if ($key > $array[$i])
{
$left_arr[] = $array[$i];
}
else
{
$right_arr[] = $array[$i];
}
}
//递归调用,直到将两边数组中,所有数据都转移到一方为止,说明已经比较结束,合并左数组、比较值、右数组返回即可
$left_arr = quickSort($left_arr);
$right_arr = quickSort($right_arr);
return array_merge($left_arr, [$key], $right_arr);
}
$sortArr = [1, 2, 3, 4, 10, 11, 34, 56, 12, 23, 98, 5];
echo '<pre>';
var_dump(quickSort($sortArr));
查找数组中,唯一重复元素
<?php
//查找,数组中,唯一重复元素
function searchArrayRepeat($arr):int
{
//先排序
sort($arr);
$count = count($arr);
$temp = $arr[0];
//将前一个元素赋值给临时变量,然后循环比较,当后一个元素等于临时变量,说明重复,即返回
//前后一个元素不等于临时变量,将该元素赋值给临时变量,去跟再下一个元素比较,直到比较完为止
for ($i = 1; $i < $count; $i++)
{
if ($temp == $arr[$i])
{
return $temp;
}
else
{
$temp = $arr[$i];
}
}
return false;
}
$arr = [1, 2, 3, 3, 4, 5, 6];
var_dump(searchArrayRepeat($arr));
斐波那契数列
<?php
//斐波那契数列:又称黄金分割数列、兔子数列
//1、1、2、3、5、8、13、21、34、……
//除前两个是1外,从第三个开始,值=前两个数的和
$arr[0] = 1;
$arr[1] = 1;
for ($i = 2; $i < 100; $i++)
{
$arr[$i] = $arr[$i - 1] + $arr[$i - 2];
}
//echo join(",", $arr); //将数组合并为一个字符串输出
echo '<pre>';
var_dump($arr);
选择排序
<?php
function selectSort($arr)
{
$len = count($arr);
//实现思路,双重循环完成,外层控制轮数,当前的最小值。内层控制比较次数
//$i 当前最小值的位置,需要参与比较的元素
for ($i = 0; $i < $len; $i++)
{
//先假设最小的值的位置
$p = $i;
//$j 当前都需要和哪些元素比较,$i后边的
for ($j = $i+1; $j < $len; $j++)
{
//$arr[$p]是当前已知的最小值
if ($arr[$p] > $arr[$j])
{
//比较,发现更小的,记录下最小值的位置,并且在下次比较时,
//应该采用已知的最小值进行比较
$p = $j;
}
}
//已经确定了当前的最小值的位置,保存到$p中
//如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可
if ($p != $i)
{
$tmp = $arr[$p];
$arr[$p] = $arr[$i];
$arr[$i] = $tmp;
}
}
//返回最终结果
return $arr;
}
$sortArr = [1, 2, 3, 4, 10, 11, 34, 56, 12, 23, 98, 5];
echo '<pre>';
var_dump(selectSort($sortArr));