PHP版本常用的排序算法汇总
//1、冒泡排序
functionbubble_sort($arr){
$n=count($arr);
for($i=0;$i<$n-1;$i++){
for($j=$i+1;;$j<$n-$i;$j++){
if($arr[$j]<$arr[$i]){
$temp=$arr[$i];
$arr[$i]=$arr[$j];
$arr[$j]=$temp;
}
}
}
}
//2、归并排序
//merge函数将指定的两个有序数组(arr1arr2,)合并并且排序
//我们可以找到第三个数组,然后依次从两个数组的开始取数据哪个数据小就先取哪个的,然后删除掉刚刚取过///的数据
functional_merge($arrA,$arrB)
{
$arrC=array();
while(count($arrA)&&count($arrB)){
//这里不断的判断哪个值小,就将小的值给到arrC,但是到最后肯定要剩下几个值,
//不是剩下arrA里面的就是剩下arrB里面的而且这几个有序的值,肯定比arrC里面所有的值都大所以使用
$arrC[]=$arrA['0']<$arrB['0']?array_shift($arrA):array_shift($arrB);
}
returnarray_merge($arrC,$arrA,$arrB);
}
//归并排序主程序
functional_merge_sort($arr)
{
$len=count($arr);
if($len<=1){
return$arr;//递归结束条件,到达这步的时候,数组就只剩下一个元素了,也就是分离了数组
}
$mid=intval($len/2);//取数组中间
$left_arr=array_slice($arr,0,$mid);//拆分数组0-mid这部分给左边left_arr
$right_arr=array_slice($arr,$mid);//拆分数组mid-末尾这部分给右边right_arr
$left_arr=al_merge_sort($left_arr);//左边拆分完后开始递归合并往上走
$right_arr=al_merge_sort($right_arr);//右边拆分完毕开始递归往上走
$arr=al_merge($left_arr,$right_arr);//合并两个数组,继续递归
return$arr;
}
$arr=array(12,5,4,7,8,3,4,2,6,4,9);
print_r(al_merge_sort($arr));
//3、二分查找-递归
//二分查找-递归
functionbin_search($array,$low,$high,$k){
if($low<=$high){
$mid=intval(($low+$high)/2);
}else{
returnfalse;
}
if($array[$mid]==$k){
return$mid;
}elseif($k<$array[$mid]){
returnbin_search($array,$low,$mid-1,$k);
}else{
returnbin_search($array,$mid+1,$high,$k);
}
}
$arr=array(12,5,4,7,3,8,4,2,6,4,9);
$index=bin_search($arr,0,10,12);//直接输出为空,不解
echo(intval($index));
//4、二分查找-非递归
functionbin_search($arr,$low,$high,$value){//$arr数组;$slow最小索引;$high最大索引$value查找的值
while($low<=$high){
$mid=intval(($low+$high)/2);
if($value==$arr[$mid]){
return$mid;
}elseif($value<$arr[$mid]){
$high=$mid-1;
}else{
$low=$mid+1;
}
}
returnfalse;
}
//5、快速排序
functionquick_sort($arr){
$n=count($arr);
if($n<=1)
return$arr;
$key=$arr[0];
$left_arr=array();
$right_arr=array();
for($i=1;$i<$n;$i++){
if($arr[$i]<=$key)
$left_arr[]=$arr[$i];
else
$right_arr[]=$arr[$i];
}
$left_arr=quick_sort($left_arr);
$right_arr=quick_sort($right_arr);
returnarray_merge($left_arr,array($key),$right_arr);
}
//6、选择排序
functionselect_sort($arr){
$n=count($arr);
for($i=0;$i<$n;$i++){
$k=$i;
for($j=$i+1;$j<$n;$j++){
if($arr[$j]<$arr[$k])
$k=$j;
}
if($k!=$i){
$temp=$arr[$i];
$arr[$i]=$arr[$k];
$arr[$k]=$temp;
}
}
return$arr;
}
//7、插入排序
functioninsertSort($arr){
$n=count($arr);
for($i=1;$i<$n;$i++){
$tmp=$arr[$i];
$j=$i-1;
while($arr[$j]>$tmp){
$arr[$j+1]=$arr[$j];
$arr[$j]=$tmp;
$j--;
if($j<0)
break;
}
}
return$arr;
}