php算法排序总结
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、算法的基本常识
1.时间复杂度 时间 循环次数 O(1) O(N) O(N²) O(N*M) 2.空间复杂度 占用空间内存 3.时间换空间 空间换时间二、下面附上一些常用算法代码
1、斐波那契
代码如下(示例):
//数组法
function test($num){
$arr=[];
for($i=0;$i<=$num;$i++)
{
if($i==0 || $i==1){
$arr[$i]=1;
}else{
$arr[$i]=$arr[$i-1]+$arr[$i-2];
}
}
return $arr[$num];
}
print_r(test(10));
//递归法
function fib_recursive($n){
if($n==0||$n==1){return 1;}
else{
return fib_recursive($n-1)+fib_recursive($n-2);
}
}
echo fib_recursive(10);
2、二分查找(数组里查找某个元素)
代码如下(示例):
function binaryRecursive(&$arr,$low,$top,$target){
if($low<=$top){
$mid = floor(($low+$top)/2);
if($arr[$mid]==$target){
return $mid;
}elseif($arr[$mid]<$target){
return binaryRecursive($arr,$mid+1,$top,$target);
}else{
return binaryRecursive($arr,$low,$mid-1,$target);
}
}else{
return -1;
}
}
$arr = array(1,3,9,23,54);
echo binaryRecursive($arr, 0, sizeof($arr), 23);
3、冒泡排序(数组排序)
思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
代码如下(示例):
$arr=array(1,43,54,62,21,66,32,78,36,76,39);
function bubble_sort( $array)
{
$count = count( $array);
if ($count <= 0 ) return false;
for($i=0 ; $i<$count; $i ++){
for($j=$count-1 ; $j>$i; $j--){
if ($array[$j] < $array [$j-1]){
$tmp = $array[$j];
$array[$j] = $array[ $j-1];
$array [$j-1] = $tmp;
}
}
}
return $array;
}
4、快速排序(数组排序)
思路分析:选择一个基准元素,通常选择第一个元素或者最后一个元素。通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素。此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。
代码如下(示例):
function quick_sort($arr)
{
// 判断是否需要运行,因下面已拿出一个中间值,这里<=1
if (count($arr) <= 1) {
return $arr;
}
$middle = $arr[0]; // 中间值
$left = array(); // 接收小于中间值
$right = array();// 接收大于中间值
// 循环比较
for ($i=1; $i < count($arr); $i++) {
if ($middle < $arr[$i]) {
// 大于中间值
$right[] = $arr[$i];
} else {
// 小于中间值
$left[] = $arr[$i];
}
}
// 递归排序划分好的2边
$left = quick_sort($left);
$right = quick_sort($right);
// 合并排序后的数据,别忘了合并中间值
return array_merge($left, array($middle), $right);
}
print_r(quick_sort($arr));
5、选择排序
思路分析:在要排序的一组数中,选出最小的一个数与第一个位置的数交换。然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
代码如下(示例):
function selectSort($arr) {
//双重循环完成,外层控制轮数,内层控制比较次数
$len=count($arr);
for($i=0; $i<$len-1; $i++) {
//先假设最小的值的位置
$p = $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;
}
6、插入排序
思路分析:在要排序的一组数中,假设前面的数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。
代码如下(示例):
function insertSort($arr) {
$len = count($arr);
for ($i = 1; $i < $len; $i++) {
// 当前值
$key = $arr[$i];
// 当前位置
$pos = $i;
// 如是当前位置 >0 && 当前值的前一个值 > 当前值 选出最值
while ($pos > 0 && $arr[$pos - 1] > $key) {
// 当前值 = 前一个值
$arr[$pos] = $arr[$pos - 1];
// 当前位置后移
$pos = $pos - 1;
}
// 找到当前值的位置
$arr[$pos] = $key;
}
return $arr;
}
var_dump(insertsort($arr));
7、桶排序
代码如下(示例):
$arr=[3,4,7,5,2,1,4];
function tong($arr){
$max=max($arr);
$min=min($arr);
$sort=[];
for($i=$min;$i<=$max;$i++){
$sort[$i]=0;
}
foreach($arr as $k=>$v){
$sort[$v] ++;
}
$new=[];
foreach($sort as $k=>$v){
while($v --){
$new[]=$k;
}
}
return $new;
}
var_dump(tong($arr));
8、猴子选大王
代码如下(示例):
$num=10;
$n=3;
function monkey($num,$n){
if($num<=1){
return 0;
}
$arr=range(1,$num);
$i=0;
while(count($arr)>1){
if(($i+1)%$n==0){
unset($arr[$i]);
}else{
array_push($arr,$arr[$i]);
unset($arr[$i]);
}
$i++;
}
return $arr[$i];
}
print_r(monkey($num,$n));
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,上文总结了一些php常用算法代码,希望会对你有一些帮助。