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循环
代码:
#冒泡排序
#原理两两比较,大的放右边,每次循环会排出一个最大的放在右边
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数组基本排序算法和查找算法的更多相关文章
- cb34a_c++_STL_算法_查找算法_(7)_lower_bound
cb34a_c++_STL_算法_查找算法_(7)_lower_bound//针对已序区间的查找算法,如set,multiset关联容器-自动排序lower_bound()--第一个可能的位置uppe ...
- cb33a_c++_STL_算法_查找算法_(6)binary_search_includes
cb33a_c++_STL_算法_查找算法_(6)binary_search_includes//针对已序区间的查找算法,如set,multiset关联容器-自动排序binary_search(b,e ...
- 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 ...
- cb28a_c++_STL_算法_查找算法_(1)find_find_if
cb28a_c++_STL_算法_查找算法_(1)find_find_iffind() //线性查找,比较慢.pos1 = find(ilist.begin(), ilist.end(), 5);fi ...
- 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 ...
- cb30a_c++_STL_算法_查找算法_(3)search_find_end
cb30a_c++_STL_算法_查找算法_(3)search_find_endsearch()pos = search(ideq.begin(), ideq.end(), ilist.begin() ...
- 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 ...
- PHP的排序算法跟查找算法
排序算法: (1)冒泡排序 $arr = array(15,8,20,50,37,85,10,5,11,4); //冒泡排序 function maoPao($arr){ for($i = 0; $i ...
- STL_算法_01_查找算法
1. 来自教程:第6讲 PPT.15 ◆ 常用的查找算法: 1.1.按条件查找N个相邻的元素 ( adjacent 是 邻近的意思) iterator = adjacent_find(iterator ...
随机推荐
- surging 微服务框架使用系列之surging介绍
首先,感谢surging的作者fanliang11为.net开源做出的贡献 其次, surging 的git地址:https://github.com/dotnetcore/surging surgi ...
- IO代码记忆
FileWriter fw = new FileWriter("hello.txt"); String s = "hello world"; fw.write( ...
- Hive HQL学习
HQL学习 1.hive的数据类型 2.hive_DDL 2.1创建.删除.修改.使用数据库 Default数据库,默认的,优先级相对于其他数据库是最高的 2.2重点:创建表_内部表_ ...
- 算法-java代码实现归并排序
归并排序 对于一个int数组,请编写一个归并排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] ...
- vue-cli脚手架的.babelrc文件 详解
{ // 此项指明,转码的规则 "presets": [ // env项是借助插件babel-preset-env,下面这个配置说的是babel对es6,es7,es8进行转码,并 ...
- 怎么使用linux命令重启服务器
一下的命令都可以重启Linux服务器: 1.shutdown -r now 2.reboot 3.startx
- DEDECMS开启邮箱验证通知的解决方法
[摘要]织梦CMS是开源内容管理系统,是国内开源CMS的领先品牌,目前程序安装量已达七十万,本文介绍DEDECMS会员注册时,开启邮箱验证通知的解决方法. 在论坛上看到很多人都说这个功能没用,邮箱根本 ...
- tp5 点击刷新验证码
<form action="<{:url('index/index/login')}>" method="post" name="f ...
- JavaScript URL传值过程中遇到的问题及知识点总结
JavaScript URL传值过程中遇到的问题及知识点总结 Web系统开发过程中经常用到URL进行传值,刚刚接触时不太会解析,会出现中文乱码问题等. 1.父子页面之间的传值(在一个页面中以加载ifr ...
- PHP获取中英文字符串的首字母
使用场景:在对地区进行筛选时,我们经常会看到按照英文字母进行筛选定位,起初想着是数据表里存储上地区与首字母关联关系,但是觉得太麻烦,然后就想着根据地区名称来获取首字母,然后对地区进行分组,由此便用到了 ...