当前位置:Gxlcms > PHP教程 > PHP常用的排序和查找算法

PHP常用的排序和查找算法

时间:2021-07-01 10:21:17 帮助过:32人阅读

本文汇总了常见的php排序算法和查找,在进行算法设计的时候有不错的借鉴价值。现分享给大家供参考之用。具体如下:

  1. <?php
  2. /**
  3. * PHP最常用的四个排序方法及二种查找方法
  4. * 下面的排序方法全部都通过测试
  5. * auther : soulence
  6. * date : 2015/06/20
  7. */
  8. //PHP冒泡排序法
  9. function bubbleSort(&$arr){
  10. //这是一个中间变量
  11. $temp=0;
  12. //我们要把数组,从小到大排序
  13. //外层循环
  14. $flag=false;//这个优化之后效率会很高,一般够用
  15. for($i=0;$i<count($arr)-1;$i++){
  16. for($j=0;$j<count($arr)-1-$i;$j++){
  17. //说明前面的数比后面的数大,就要交换
  18. if($arr[$j]>$arr[$j+1]){
  19. $temp=$arr[$j];
  20. $arr[$j]=$arr[$j+1];
  21. $arr[$j+1]=$temp;
  22. $flag=true;
  23. }
  24. }
  25. if(!$flag){
  26. //已经是有序了
  27. break;
  28. }
  29. $flag=false;
  30. }
  31. }
  32. //PHP选择排序法 效率比冒泡要高
  33. function selectSort(&$arr){
  34. $temp=0;
  35. for($i=0;$i<count($arr)-1;$i++){
  36. //假设$i就是最小的数
  37. $minVal=$arr[$i];
  38. //记录我认为的最小数的下标
  39. $minIndex=$i;
  40. for($j=$i+1;$j<count($arr);$j++){
  41. //说明我们认为的最小值,不是最小
  42. if($minVal>$arr[$j]){
  43. $minVal=$arr[$j];
  44. $minIndex=$j;
  45. }
  46. }
  47. //最后交换
  48. $temp=$arr[$i];
  49. $arr[$i]=$arr[$minIndex];
  50. $arr[$minIndex]=$temp;
  51. }
  52. }
  53. //插入排序法(小到大排序) 效率又比 选择排序法要高一些
  54. function insertSort(&$arr){
  55. //先默认下标为0的这个数已经是有序
  56. for($i=1;$i<count($arr);$i++){
  57. //$insertVal是准备插入的数
  58. $insertVal=$arr[$i];
  59. //准备先和谁下标为$inserIndex的比较
  60. $inserIndex=$i-1;
  61. //如果这个条件满足,说明我们还没有找到适当的位置
  62. while($inserIndex >= 0 && $insertVal < $arr[$inserIndex]){
  63. //同时把数后移
  64. $arr[$inserIndex+1] = $arr[$inserIndex];
  65. $inserIndex--;
  66. }
  67. //插入(这时就给$inserIndex找到适当的位置)
  68. $arr[$inserIndex+1] = $insertVal;
  69. }
  70. }
  71. //快速排序法 第一种写法 不是我实现的
  72. function quickSort($left,$right,&$arr){
  73. $l=$left;
  74. $r=$right;
  75. $pivot= $arr[($left+$right)/2];
  76. while($l<$r){
  77. while($arr[$l]<$pivot){
  78. $l++;
  79. }
  80. while($arr[$r]>$pivot){
  81. $r--;
  82. }
  83. if($l>=$r){
  84. break;
  85. }
  86. $temp=$arr[$l];
  87. $arr[$l]=$arr[$r];
  88. $arr[$r]=$temp;
  89. if($arr[$l]==$pivot){
  90. --$r;
  91. }
  92. if($arr[$r]==$pivot){
  93. ++$l;
  94. }
  95. }
  96. if($l==$r){
  97. $l++;
  98. $r--;
  99. }
  100. if($left<$r) quickSort($left,$r,$arr);
  101. if($right>$l) quickSort($l,$right,$arr);
  102. }
  103. /**
  104. * 快速排序方法 第二种实现方法 自己实现的
  105. * PHP快速排序方法
  106. * $order asc 小到大 desc大到小 默认是asc
  107. * $order 的值只能为 asc desc 如果乱写一个值也是按asc排序的
  108. */
  109. function quickSort2($arr,$order = 'asc')
  110. {
  111. if(count($arr) <= 1)
  112. return $arr;
  113. $arr_left = $arr_right = array();
  114. $val = $arr[0];unset($arr[0]);
  115. foreach ($arr as $v) {
  116. if(strtolower($order) == 'desc'){
  117. if($v < $val)
  118. $arr_right[] = $v;
  119. else
  120. $arr_left[] = $v;
  121. }else{
  122. if($v > $val)
  123. $arr_right[] = $v;
  124. else
  125. $arr_left[] = $v;
  126. }
  127. }
  128. $arr_left = quickSort($arr_left,$order);
  129. $arr_right = quickSort($arr_right,$order);
  130. return array_merge($arr_left,array($val),$arr_right);
  131. }
  132. //下面是查找
  133. $arr=array(46,90,900,0,-1);
  134. //这是按顺序查询
  135. function search(&$arr,$findVal){
  136. $flag=false;
  137. for($i=0;$i<count($arr);$i++){
  138. if($findVal==$arr[$i]){
  139. echo "找到了,下标为=$i";
  140. $flag=true;
  141. //查询一次,如果多次就不要这个 break;
  142. }
  143. }
  144. if(!$flag){
  145. echo "查无此数";
  146. }
  147. }
  148. //调用二分查找
  149. $arr=array(0,90,900,99990);//注意,一定要是有序的
  150. binarySwarch($arr,90,0,count($arr)-1);
  151. //二分查找函数,它有一个前提,查找的数组必须是有序的
  152. function binarySearch(&$arr,$findVal,$leftIndex,$rightIndex){
  153. //如果$rightIndex < $leftIndex条件成立,说明没有这个数,则退出
  154. if($rightIndex < $leftIndex){
  155. echo "找不到该数";
  156. return;
  157. }
  158. //首先找到中间这个数 round是出于如果出现小数,四舍五入
  159. $middleIndex=round(($rightIndex+$leftIndex)/2);
  160. //如果大于则向后面找
  161. if($findVal > $arr[$middleIndex]){
  162. binarySearch($arr,$findVal,$middleIndex+1,$rightIndex);
  163. //如果小于中间数,则向前面找
  164. }else if($findVal < $arr[$middleIndex]){
  165. binarySearch($arr,$findVal,$leftIndex,$middleIndex-1);
  166. }else{
  167. echo "找到这个数。下标是$middleIndex";
  168. }
  169. }
  170. ?>

希望本文所述排序算法和查找算法实例对大家的php程序设计有所帮助。

人气教程排行