关于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循环

 代码:

 #冒泡排序
#原理两两比较,大的放右边,每次循环会排出一个最大的放在右边
function maopao($arr){
$len=count($arr);
for ($i=0; $i < $len-1; $i++) {
for ($a=0; $a <$len-1-$i ; $a++) {
if ($arr[$a]>$arr[$a+1]) {
$t=$arr[$a];
$arr[$a]=$arr[$a+1];
$arr[$a+1]=$t;
}
}
}
return $arr; }
$arr=[5,6,8,1,2,3,7,55,69,23,11];
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
假设数组中靠左的元素是小的,然后跟右边的元素比较,如果左边的大于右边的就换到左边,每趟都能确定出一个最小值,缺点在于不稳定性,速度快于冒泡排序。
代码:
 #选择排序
#那最左边的和右边比较如果大于就换到右边,每趟确定出一个最小值
function xuanze($arr){
$len=count($arr);
for ($i=0; $i <$len-1 ; $i++) {
//假设当前最左边的元素是最小值,保存下标
$key=$i;
for ($j=$i+1; $j < $len; $j++) {
//如果左边的大于右边的就保存下标
if($arr[$key]>$arr[$j]){
$key=$j;
}
}
//找到最小的值,交换下标
$temp=$arr[$key];
$arr[$key]=$arr[$i];
$arr[$i]=$temp;
}
return $arr;
}
$arr=[11,2,3,55,66,99];
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));

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

 
 

PHP数组基本排序算法和查找算法的更多相关文章

  1. cb34a_c++_STL_算法_查找算法_(7)_lower_bound

    cb34a_c++_STL_算法_查找算法_(7)_lower_bound//针对已序区间的查找算法,如set,multiset关联容器-自动排序lower_bound()--第一个可能的位置uppe ...

  2. cb33a_c++_STL_算法_查找算法_(6)binary_search_includes

    cb33a_c++_STL_算法_查找算法_(6)binary_search_includes//针对已序区间的查找算法,如set,multiset关联容器-自动排序binary_search(b,e ...

  3. cb32a_c++_STL_算法_查找算法_(5)adjacent_find

    cb32a_c++_STL_算法_查找算法_(5)adjacent_findadjacent_find(b,e),b,begin(),e,end()adjacent_find(b,e,p),p-par ...

  4. cb28a_c++_STL_算法_查找算法_(1)find_find_if

    cb28a_c++_STL_算法_查找算法_(1)find_find_iffind() //线性查找,比较慢.pos1 = find(ilist.begin(), ilist.end(), 5);fi ...

  5. cb31a_c++_STL_算法_查找算法_(4)find_first_of

    cb31a_c++_STL_算法_查找算法_(4)find_first_offind_first_of(b,e,sb,se),sb,second begin, se,second end();find ...

  6. cb30a_c++_STL_算法_查找算法_(3)search_find_end

    cb30a_c++_STL_算法_查找算法_(3)search_find_endsearch()pos = search(ideq.begin(), ideq.end(), ilist.begin() ...

  7. cb29a_c++_STL_算法_查找算法_(2)search_n

    cb29a_c++_STL_算法_查找算法_(2)search_n//比如:连续查找连续的n个8search_n(b,e,c,v),迭代器b,begin(),e,end().连续的c个vpos=sea ...

  8. PHP的排序算法跟查找算法

    排序算法: (1)冒泡排序 $arr = array(15,8,20,50,37,85,10,5,11,4); //冒泡排序 function maoPao($arr){ for($i = 0; $i ...

  9. STL_算法_01_查找算法

    1. 来自教程:第6讲 PPT.15 ◆ 常用的查找算法: 1.1.按条件查找N个相邻的元素 ( adjacent 是 邻近的意思) iterator = adjacent_find(iterator ...

随机推荐

  1. IntersectionObserver实现图片懒加载

    API: https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API 直接上源码: <!DOCTYPE ...

  2. SQL用了Union后的排序问题

    最近使用SQL语句进行UNION查询,惊奇的发现:SQL没问题,UNION查询也没问题,都可以得到想要的结果,可是在对结果进行排序的时候,却出问题了. 1.UNION查询没问题 SELECT `id` ...

  3. Python 3 利用 Dlib 19.7 和 sklearn机器学习模型 实现人脸微笑检测

    0.引言  利用机器学习的方法训练微笑检测模型,给一张人脸照片,判断是否微笑:   使用的数据集中69张没笑脸,65张有笑脸,训练结果识别精度在95%附近: 效果: 图1 示例效果 工程利用pytho ...

  4. 【编程技巧】NSTimer类的使用

    创建一个 Timer + scheduledTimerWithTimeInterval: invocation: repeats: + (NSTimer *)scheduledTimerWithTim ...

  5. 【视频编解码·学习笔记】3. H.264视频编解码工程JM的下载与编解码

    一.下载JM工程: JM是H.264标准制定团队所认可的官方参考软件.网址如下 http://iphome.hhi.de/suehring/tml/ 从页面中可找到相应的工程源码,本次选择JM 8.6 ...

  6. java —— 内部类

    _ 普通内部类 静态内部类 局部内部类 匿名内部类 内部类 内部类是定义在另一个类中的类,定义内部类会起到的作用有以下三点: 1.内部类方法访问该类定义所在的作用域中的数据,包括私有的数据. 2.内部 ...

  7. 使用TransactionScope做分布式事务协调

    //场景是使用在多个数据库之间的协调,.NET 2.0使用一个新的类型 TransactionScope来进行协调,这与之前的COM+协调是相对来说更加方便的 //需要引用一个新的程序集:System ...

  8. Android Studio 下获取debug sha1和md5

    Open Android Studio Open Your Project Click on Gradle (From Right Side Panel, you will see Gradle Ba ...

  9. java IO(二):字节流

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  10. 浅谈ES6

    ECMAScript6.0(简称ES6)是javaScript语言的下一代标准,已经在2015年6月正式发布了.它的目标,使得javaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言 ...