关于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. HDU 1233 还是畅通工程(模板——克鲁斯卡尔算法)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1233 题意描述: 输入n个城镇以及n*(n-1)/2条道路信息 计算并输出将所有城镇连通或者间接连通 ...

  2. Linux系统上安装JDK和Tomcat服务器

    一.安装JDK 1.查看当前Linux系统是否已经安装java  输入命令: rpm -qa | grep java 2.卸载两个openJDK  输入命令:rpm -e --nodeps 3.上传j ...

  3. Arrays类详解

    数组是数据结构中最简单的一种类型.在平常的使用上也比较多见.今天就来总结一下数组在使用过程中的一些心得 1.java中包装数组的一些基本用法的抽象类  java.util.Arrays.这个类中包含操 ...

  4. 一步一步从原理跟我学邮件收取及发送 5.C语言的socket示例

    说到 C 语言版本的程序,首先要解决的问题就是兼容性. 作为 20 年开发有 10 多年是在服务端的程序员,我深刻地感受到服务端平台的两极分化之严重,linux 派对 windows 那是超级的不屑一 ...

  5. 解决DEDECMS Call to undefined function dede_htmlspecialchars()

    作者:DEDECMS建站网 关注: 3610 时间:2015-11-18 16:39 内容详情 以下内容您可能感兴趣: 织梦官方在2015年6月18日更新了织梦5.7,为了兼容php5.4+,修改了/ ...

  6. 虚拟主机导入MySQL出现Unknown character set: ‘utf8mb4’

    http://www.lmlblog.com/14.html 前几天进行网站搬家,MySQL导入数据的时候,出现以下错误(没有定义的编码集utf8mb4): SQL 查询: ; MySQL 返回:文档 ...

  7. Mysql执行计划说明

    Mysql执行计划翻译: 官网原文请见http://dev.mysql.com/doc/refman/5.6/en/explain-output.html:5.6 EXPLAIN语句提供有关SELEC ...

  8. android项目红色感叹号

    Project --> Clean 清理一下,一般要注意的,如果是你的项目文件有错误,特别是xml文件,清理后那个R资源文件会不见的,那就需要你把错误修正后自动生成的.

  9. Nodejs的运行原理-生态篇

    前言 这里是重点:Nodejs 是由v8 engine,libuv和内置模块组成,可以将v8 engine和 libuv看成一个库,两者是以源码的方式直接编译执行node中去的. 这是一个广泛的介绍, ...

  10. Linuxc - define 与 typedef的区别

    预处理就是讲一些头文件展开. 预处理还会将使用到宏定义的值替换为真正的值.宏只是单纯的字符串的替换. #define 宏定义 眼里没有语法,不用分号结尾. typedef 定义别名,是有语法的,要用分 ...