php的一些简单算法程序(冒泡、快速等)
冒泡排序:
function buttle_sort($array) { $len=count($array); if($len<2){ return $array; } for($i=0;$i<$len;$i++){ $flag = false;//本趟排序开始前,交换标志应为假 for($j=$len-1;$j>$i;$j--){ if($array[$j]<$array[$j-1]){ $tmp = $array[$j]; $array[$j] = $array[$j-1]; $array[$j-1] = $tmp; $flag = true;//发生了交换,故将交换标志置为真 } } } if(!$flag)//本趟排序未发生交换,提前终止算法 return $array; }
选择排序
1 <?php 2 //选择排序 3 function selectSort($arr) 4 { 5 $count = count($arr); 6 if ($count < 2) { 7 return $arr; 8 } 9 for ($i = 0; $i < $count; $i ++) { 10 $min = $i; 11 for($j=$i + 1;$j < $count;$j++){ 12 if ($arr[$min] > $arr[$j]) { 13 $min = $j; // 找到最小的那个元素的下标 14 } 15 } 16 if ($min != $i) { // 如果下标不是$i 则互换。 17 $tmp = $arr[$i]; 18 $arr[$i] = $arr[$min]; 19 $arr[$min] = $tmp; 20 } 21 } 22 return $arr; 23 }
冒泡排序其实上是和选择排序相比,并无明显差别。都是找到最小的,放到最左端。依次循环解决问题。差别在于冒泡排序的交换位置的次数较多,而选择排序则是找到最小的元素的下标,然后直接和最左端的交换位置。
快速排序算法:
1 //快速排序 2 function quickSort(&$arr){ 3 if(count($arr)>1){ 4 $k=$arr[0]; 5 $x=array(); 6 $y=array(); 7 $_size=count($arr); 8 for($i=1;$i<$_size;$i++){ 9 if($arr[$i]<=$k){ 10 $x[]=$arr[$i]; 11 }elseif($arr[$i]>$k){ 12 $y[]=$arr[$i]; 13 } 14 } 15 $x=quickSort($x); 16 $y=quickSort($y); 17 return array_merge($x,array($k),$y); 18 }else{ 19 return$arr; 20 } 21 }
二分查找
1 /**二分查找:查找一个值在数组中的位置 2 * @$arr:操作的数组,前提是按顺序排列 3 * @$val:查找的值 4 * @$low:查找的起始位置,默认从数组的第一个数找起 5 * @hight:查找的结束位置**/ 6 function binarySearch($arr, $val, $hight, $low=0){ 7 while($low <= $hight){ 8 $mid = ceil($low + ($hight - $low) / 2); 9 if($arr[$mid] == $val){ 10 return $mid; 11 }elseif($arr[$mid] > $val){ 12 $hight = $mid -1; 13 }else{ 14 $low = $mid +1; 15 } 16 } 17 return -1; 18 }