PHP数组基本排序算法和查找算法

关于PHP中的基础算法,小结一下,也算是本博客的第一篇文章

1.2种排序算法
冒泡排序:
例子:个人见解
	5 6 2 3 7 9

	第一趟
	5 6 2 3 7 9
	5 2 6 3 7 9
	5 2 3 6 7 9
	5 2 3 6 7 9
	5 2 3 6 7  9

	第二趟
	2 5 3 6 7  9
	2 3 5 6 7  9
	2 3 5 6 7  9
	2 3 5 6  7  9

	第三趟
	2 3 5 6  7  9
	2 3 5 6  7  9
	2 3 5  6  7  9

	第四趟
	2 3 5  6  7  9
	2 3  5  6  7  9

	第五趟
     2  3  5  6  7  9 

    两两比较,每一趟中都会确定出最大的数然后放在右边,冒泡速度较慢,但是比较稳定。

 代码方面主要是嵌套的for循环

 代码:

 1 #冒泡排序
 2 #原理两两比较,大的放右边,每次循环会排出一个最大的放在右边
 3 function maopao($arr){
 4     $len=count($arr);
 5     for ($i=0; $i < $len-1; $i++) { 
 6         for ($a=0; $a <$len-1-$i ; $a++) { 
 7             if ($arr[$a]>$arr[$a+1]) {
 8                 $t=$arr[$a];
 9                 $arr[$a]=$arr[$a+1];
10                 $arr[$a+1]=$t;
11             }
12         }
13     }
14     return $arr;
15 
16 }
17 $arr=[5,6,8,1,2,3,7,55,69,23,11];
18 var_dump(maopao($arr));

 

选择排序:
例子:个人见解
	#选择排序
	8 5 6 2 4 7

	第一趟
	5 8 6 2 4 7
	5 8 6 2 4 7
	2 8 6 5 4 7
	2 8 6 5 4 7
	2  8 6 5 4 7

	第二趟

	2  6 8 5 4 7
	2  5 8 6 4 7
	2  4 8 6 5 7
	2  4  8 6 5 7

	第三趟

	2  4  6 8 5 7
	2  4  5 8 6 7
	2  4  5  8 6 7

	第四趟
	2  4  5  6 8 7
	2  4  5  6  8 7

	第五趟
	2  4  5  6  7  8

假设数组中靠左的元素是小的,然后跟右边的元素比较,如果左边的大于右边的就换到左边,每趟都能确定出一个最小值,缺点在于不稳定性,速度快于冒泡排序。
代码:
 1 #选择排序
 2 #那最左边的和右边比较如果大于就换到右边,每趟确定出一个最小值
 3 function xuanze($arr){
 4     $len=count($arr);
 5     for ($i=0; $i <$len-1 ; $i++) { 
 6         //假设当前最左边的元素是最小值,保存下标
 7         $key=$i;
 8         for ($j=$i+1; $j < $len; $j++) { 
 9             //如果左边的大于右边的就保存下标
10             if($arr[$key]>$arr[$j]){
11                 $key=$j;
12             }
13         }
14         //找到最小的值,交换下标
15         $temp=$arr[$key];
16         $arr[$key]=$arr[$i];
17         $arr[$i]=$temp;
18     }
19     return $arr;
20 }
21 $arr=[11,2,3,55,66,99];
22 var_dump(xuanze($arr));

快速排序:

原理:先取数组中的任意一个数作为基准数,一般是数组下标的第一个,然后遍历一遍数组,声明两个空数组,升序的话,将小的元素放在左边,将大的元素放在右边,然后利用递归进行继续分多个数组然后排序。

function quick_sort($arr){
     $len=count($arr);
     if($len<=1)return $arr;
     $left=$right=[];
    for($i=1;$i<$len;$++;){
        if($arr[0]>$arr[$i]){
          $left[]=$arr[$i];
        }else{
          $right[]=$arr[$i];
       }
    }
   $left=quick_sort($left);
   $right=quick_sort($right);
    return arrr_merge($left,array($arr[0]),$right);
}

关于排序先写三个,日后跟新~~

1.2种查找算法
顺序查找:
这个比较简单,原理就是从第一个开始比较直到找到,效率比较低,较稳定。
代码:
#选择排序
#存在值返回该值的下标,不存在返回false
function shunxu($arr,$target){
    $len=count($arr);
    for ($i=0; $i <$len ; $i++) { 
        if ($arr[$i]==$target) {
            return $i;
        }
    }
    return false;
}
$arr=[2,5,6,3,8,52,6];
var_dump(shunxu($arr,52));
二分法查找
条件严格,数组必须有序排列,效率较高。
原理:取一个中间值进行和要查找的值比较,假如数组升序排序,值大于要查找的值,然后下标减一

#二分法查找
#选择升序数组
function erfen($arr,$target){
    $len=count($arr)-1;
    $middle=ceil($len/2);
    if ($arr[$middle]==$target) {
        return true;
    }elseif($arr[$middle]>$target){
        for ($i=0; $i <$middle ; $i++) { 
        if ($arr[$i]==$target) {
            return true;
        }
    }
  }else{
      //因为循环的是长度所以得+1
      for ($i=$middle; $i < $len+1 ; $i++) { 
        if ($arr[$i]==$target) {
            return true;
        }
    }
  }
  return false;
}
$arr=[1,2,3,4,5,6,7,10,11];
var_dump(erfen($arr,11));

先写这几个吧,日后在更!

 

 

 
posted @ 2018-02-19 20:58  不知名程序猿  阅读(430)  评论(0编辑  收藏  举报