二分查找及快速排序-PHP

php  @amazeUI  2016-11-28 11:45:31

    二分查找和快速排序思想上有很大的相似度,就是做一个起始点,开始往左右做动作,也同样是由递归实现,当然也可以不用递归实现。但是我觉得也不能用php内置特有的函数- -,我找了很多php的快速排序,几乎都用到了array_merge函数。当然使用的array_merge函数里的那个快速排序也是快排思想- -。


public function quickSort($left,$right,&$arr)

{

$l= $left;

$r= $right;

$pivot= $arr[($left + $right)/ 2];

$temp= 0;

while ($l< $r) {

while ($arr[$l]< $pivot) {

$l++;

}

while ($arr[$r]> $pivot) {

$r--;

}

if ($l>= $r) {

break;

}

$temp= $arr[$l];

$arr[$l]= $arr[$r];

$arr[$r]= $temp;

if ($arr[$l]== $pivot) {

--$r;

}

if ($arr[$r]== $pivot) {

++$l;

}

}

if ($l== $r) {

$l++;

$r--;

}

if ($left < $r) {

self::quickSort($left, $r,$arr);

}

if ($right > $l) {

self::quickSort($l,$right,$arr);

}

}

下面是二分查找:

摸索二分查找法,对于php数组而言,要找一个值太容易了,array_search一下就好了。二分查找又叫做折半查找。假设我在纸上写了一个整数,在零到一百之间,需要你来猜我纸上写的到底是几,这个怎么猜?最快速的办法就是做二分查找,假设纸上的数字为10,已知范围为0到100,先将范围值折半,猜50,再询问50是比纸上的数字大还是小,答案是小了,再将范围值缩小至0-50,再次折半,猜25。。。这样才是最快的方式。用代码实现二分查找法,基本有两个方式,一个是递归,一个是while循环。我选择用递归,递归的方式更直白和简单,更符合以上所说逻辑,好理解。

//$search 函数 $array为数组,$K为要找的值,$low为查找范围的最小键值,$high为查找范围的最大键值

public function binarySearch($array, $k, $low = 0, $high = 0)

{

//判断数组元素的数量

echo 1;

if (count($array) != 0 and $high == 0) {      //判断是否为第一次调用

//数组的元素个数

$high = count($array);

}

if ($low <= $high) {      //如果还存在剩余的数组元素

$mid = intval(($low + $high) / 2);      //取$low 与$high的中间值3

//return $array[$mid];

if ($array[$mid] == $k) {

return $mid;    //如果找到则返回

} elseif ($array[$mid] > $k) {//如果要找的值小于中间值

//如果上面没有找到,则继续查找

return self::binarySearch($array, $k, $low, $mid - 1);

} else {

return self::binarySearch($array, $k, $mid + 1, $high);//5-11,8-11,9-11,10-11,10+11/2再取整还是10,开始死循环---

}

}

return "没有要查找的值";

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序; 输入:n个数:a1,a2,a3,…,an 输...
    code武阅读 3,931评论 0 0
  • 某次二面时,面试官问起Js排序问题,吾绞尽脑汁回答了几种,深感算法有很大的问题,所以总计一下! 排序算法说明 (1...
    流浪的先知阅读 4,924评论 0 4
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,358评论 0 33
  • 首先总结以下Java和C、C++中的一般控制台输入方式,方便以后的编程题: java键盘输入 java读文件(会自...
    androidjp阅读 6,831评论 0 16
  • 草地上开着一朵野花 芳香着大地的情话 我就像那朵野花 你无意邂逅,我却开满了盛夏 坐在草地上弹着吉他 忘记了这世间...
    活在诗下阅读 3,875评论 1 3

友情链接更多精彩内容