关于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. PHP error_reporting() 错误控制函数功能详解

    定义和用法: error_reporting() 设置 PHP 的报错级别并返回当前级别.   函数语法: error_reporting(report_level)   如果参数 level 未指定 ...

  2. Python3.6.1的安装

    Python 3.61的下载和安装,下载地址:https://www.python.org/downloads/ 选择最近的版本,目前为Python3.6.1,下载后直接安装即可 下载包为: 双击安装 ...

  3. oracle03

    (1)表中数据操作 插入数据: a.插入单条 insert into myemp(empno,ename) values(1111,'张三'); b.批量插入 insert into myemp se ...

  4. MySQL的char和varchar针对空格的处理

    MySQL的char和varchar存储和查询中包含空格的实验 MySQL版本 一.测试char包含空格的存储和查询 测试发现,存储的数据,char数据类型的右侧空格存储的时候被删除了,但是左侧空格还 ...

  5. rpc-远程调用框架

    简单框架编写 http://blog.csdn.net/u013177446/article/details/67638021 netty解决拆包粘包问题 http://www.cnblogs.com ...

  6. Gsp

    Gsp 接触到了groovy开发,自然就接触到了gsp.在grails开发中,gsp作为Grails的视图技术,事实上, 不过是标准 HTML 加上一些提供动态内容的 Grails 标记而已. gsp ...

  7. 【转】shell学习笔记(三)——引用变量、内部变量、条件测试、字符串比较、整数比较等

    1.env显示当前的环境变量 2.PS1='[\u@\h \w \A] \$' 可以设置bash的命令与提示符. 3.echo $$ 显示当前bash的PID号 4.echo $?显示上一条指令的回传 ...

  8. LCA(最近公共祖先)之倍增算法

    概述 对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. 如图,3和5的最近公共祖先是1,5和2的最近公共祖先是4 在本篇中我们先介 ...

  9. Linux中变量#,@,0,1,2,*,$$,$?的意思

    $# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 $@ 是传给脚本的所有参数的列表 $* 是以一个单字符串显示 ...

  10. final修饰符,多态,抽象类,接口

    1:final关键字(掌握)    (1)是最终的意思,可以修饰类,方法,变量.    (2)特点:        A:它修饰的类,不能被继承.        B:它修饰的方法,不能被重写.      ...