PHP面试常用算法
2018-06-22 04:53:32来源:未知 阅读 ()
一、冒泡排序
基本思想:
对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换。这样比较小(大)的数值就将逐渐从后面向前面移动。
//冒泡排序
1 <?php 2 //冒泡排序 3 function mysort($arr) 4 { 5 for($i = 0; $i < count($arr); $i++) 6 { 7 $isSort = true; 8 for ($j=0; $j< count($arr) - $i - 1; $j++) 9 { 10 if($arr[$j] < $arr[$j+1]) 11 { 12 $isSort = false; 13 $temp = $arr[$j]; 14 $arr[$j] = $arr[$j+1]; 15 $arr[$j+1] = $temp ; 16 } 17 } 18 if($isSort) 19 { 20 break; 21 } 22 } 23 return $arr; 24 } 25 26 $arr = array(3,1,2,6,5,3,3,9,95,65); 27 var_dump(mysort($arr)); 28 ?>
二、快速排序
基本思想:
在数组中挑出一个元素(多为第一个)作为标尺,扫描一遍数组将比标尺小的元素排在标尺之前,将所有比标尺大的元素排在标尺之后,通过递归将各子序列分别划分为更小的序列直到所有的序列顺序一致。
//快速排序
1 <?php 2 //快速排序 3 function quick_sort($arr) 4 { 5 //先判断是否需要继续进行 6 $length = count($arr); 7 if($length <= 1) 8 { 9 return $arr; 10 } 11 12 $base_num = $arr[0];//选择一个标尺 选择第一个元素 13 14 //初始化两个数组 15 $left_array = array();//小于标尺的 16 $right_array = array();//大于标尺的 17 for($i=1; $i<$length; $i++) 18 { //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内 19 if($base_num > $arr[$i]) 20 { 21 //放入左边数组 22 $left_array[] = $arr[$i]; 23 } 24 else 25 { 26 //放入右边 27 $right_array[] = $arr[$i]; 28 } 29 } 30 //再分别对 左边 和 右边的数组进行相同的排序处理方式 31 //递归调用这个函数,并记录结果 32 $left_array = quick_sort($left_array); 33 $right_array = quick_sort($right_array); 34 //合并左边 标尺 右边 35 return array_merge($left_array, array($base_num), $right_array); 36 } 37 38 $arr = array(3,1,2); 39 var_dump(quick_sort($arr)); 40 41 ?>
三、二分查找
基本思想:
假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。(数据量大的时候使用)
//二分查找
1 <?php 2 //二分查找 3 function bin_search($arr,$low,$high,$k) 4 { 5 if($low <= $high) 6 { 7 $mid = intval(($low + $high)/2); 8 if($arr[$mid] == $k) 9 { 10 return $mid; 11 } 12 else if($k < $arr[$mid]) 13 { 14 return bin_search($arr,$low,$mid-1,$k); 15 } 16 else 17 { 18 return bin_search($arr,$mid+1,$high,$k); 19 } 20 } 21 return -1; 22 } 23 24 $arr = array(1,2,3,4,5,6,7,8,9,10); 25 26 print(bin_search($arr,0,9,3)); 27 ?>
四、顺序查找
基本思想:
从数组的第一个元素开始一个一个向下查找,如果有和目标一致的元素,查找成功;如果到最后一个元素仍没有目标元素,则查找失败。
//顺序查找
1 <?php 2 //顺序查找 3 function seq_search($arr,$n,$k) 4 { 5 $array[$n] = $k; 6 for($i = 0;$i < $n; $i++) 7 { 8 if($arr[$i] == $k) 9 { 10 break; 11 } 12 } 13 14 if($i < $n) 15 { 16 return $i; 17 } 18 else 19 { 20 return -1; 21 } 22 } 23 ?>
五、写一个函数,能够遍历一个文件下的所有文件和子文件夹
1 <?php 2 function my_scandir($dir) 3 { 4 $files = array(); 5 if($handle = opendir($dir)) 6 { 7 while (($file = readdir($handle))!== false) 8 { 9 if($file != '..' && $file != '.') 10 { 11 if(is_dir($dir."/".$file)) 12 { 13 $files[$file]=my_scandir($dir."/".$file); 14 } 15 else 16 { 17 $files[] = $file; 18 } 19 } 20 } 21 22 closedir($handle); 23 return $files; 24 } 25 } 26 27 var_dump(my_scandir('../')); 28 ?>
六、写一个函数,尽可能高效的从一个标准url中取出文件的扩展名
1 <?php 2 function getExt($url) 3 { 4 $arr = parse_url($url);//parse_url解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分 5 //'scheme' => string 'http' (length=4) 6 //'host' => string 'www.sina.com.cn' (length=15) 7 //'path' => string '/abc/de/fg.php' (length=14) 8 //'query' => string 'id=1' (length=4) 9 $file = basename($arr['path']);// basename函数返回路径中的文件名部分 10 $ext = explode('.', $file); 11 return $ext[count($ext)-1]; 12 } 13 14 print(getExt('http://www.sina.com.cn/abc/de/fg.html.php?id=1')); 15 16 ?>
七、实现中文字符串截取无乱码的方法
可使用mb_substr,但是需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- PHP写UltraEdit插件脚本实现方法 2020-03-29
- php 带逗号千位符数字的处理方法 2020-03-28
- PHP三元运算符的结合性介绍 2020-03-28
- PHP静态延迟绑定和普通静态效率的对比 2020-03-28
- 基于php流程控制语句和循环控制语句 2020-03-28
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash