常见算法题 php实现

<?php
function out($str){
	echo $str.'<br>';
}
$arr= array(1,4,7,9,11,45,111);
//二分法查找
function bin_search($arr, $start, $end, $key){
	if($start > $end){
		return 0;
	}
	$mid = ceil(($start+$end)/2);
	if($arr[$mid] == $key){
		return $arr[$mid];
	} elseif($arr[$mid] < $key){
		return bin_search($arr, $mid+1, $end, $key);
	} else{
		return bin_search($arr, $start, $mid-1, $key);
	}
}
out(bin_search($arr, 0, count($arr)-1, 7));
out(bin_search($arr, 0, count($arr)-1, 45));
out(bin_search($arr, 0, count($arr)-1, 1));
out(bin_search($arr, 0, count($arr)-1, 111));
out(bin_search($arr, 0, count($arr)-1, 9));
out(bin_search($arr, 0, count($arr)-1, 56));

$arr= array(4,1,7,45,11,9,111);
// 冒泡排序
function bubble_sort($arr){
	$count = count($arr);
	for($i = 0; $i < $count; $i++){
		for($j = $i+1; $j < $count ; $j++){
			if($arr[$i] < $arr[$j]){
				$t = $arr[$i];
				$arr[$i] = $arr[$j];
				$arr[$j] = $t;
			}
		}
	}
	return $arr;
}
var_dump(bubble_sort($arr));

// 快速排序
function quick_sort($arr){
	//static $c = 0;
	if(count($arr) <= 1){
		return $arr;
	}
	//$c == 100 ? exit() : $c++ ;
	$l_arr = array();
	$r_arr = array();
	$key = $arr[0];
	for($i = 1; $i<count($arr); $i++){
		if($arr[$i] < $key){
			$r_arr[] = $arr[$i];
		} else {
			$l_arr[] = $arr[$i];
		}
	}
	$l_arr = quick_sort($l_arr);
	$r_arr = quick_sort($r_arr);
	return array_merge($l_arr, array($key), $r_arr);
}
var_dump(quick_sort($arr));

// 选择排序
function select_sort($arr){
	$count = count($arr);
	for($i=0; $i<$count; $i++){
		$max_k = $i;
		for($j= $i+1; $j<$count; $j++){
			if($arr[$j] > $arr[$max_k]){
				$max_k = $j;
			}
		}
		if($i != $max_k){
			$t = $arr[$i];
			$arr[$i] = $arr[$max_k];
			$arr[$max_k] = $t;
		}
	}
	return $arr;
}
var_dump(select_sort($arr));

// 插入排序
function insert_sort($arr){
	for($i = 1; $i < count($arr); $i++){
		$j = $i;
		while($j > 0 && $arr[$j] > $arr[$j-1]){
			$t = $arr[$j-1];
			$arr[$j-1] = $arr[$j];
			$arr[$j] = $t;
			$j--;
		}
	}
	return $arr;
}
var_dump(insert_sort($arr));

// 2维数组排序
$arr = array(31=>array('id'=>10001, 'name'=>'allen'),
					  7=>array('id'=>10020, 'name'=>'bbb'),
					  13=>array('id'=>10013, 'name'=>'fff'),
					  45=>array('id'=>10024, 'name'=>'dddd'),
					  65=>array('id'=>10076, 'name'=>'gggg'),
					  12=>array('id'=>10047, 'name'=>'jjjj'),
					  23=>array('id'=>10058, 'name'=>'hhh'),
					  43=>array('id'=>10039, 'name'=>'kkkkk'),
					  56=>array('id'=>10011, 'name'=>'iiiiii'));
function arr_sort($arr, $key){
	foreach($arr as $k => $v){
		$a[$k] = $v[$key];
	}
	asort($a);
	foreach($a as $k => $v){
		$b[$k] = $arr[$k];
	}
	return $b;
}
var_dump(arr_sort($arr, 'id'));

// 有一对兔子,从出生后的第三个月起开始生出一个小兔子,小兔子长到三个月大也开始生出小兔子,假如兔子不会死,问20个月后兔子总数~~
function rabbits($n){
	static $total_count = 2;
	for($i = 0 ; $i < $n; $i++){
		if($i > 1){
			$total_count++;
			rabbits($n-$i);
		}
	} 
	return $total_count;
}
out('');
out(rabbits(5));
out(rabbits(20));

// 删除一个
function del($arr, $count){
	$n = 0;
	$flag = false; // 标志循环结束
	$jump = true;  // 跳过开始一部分,从上一个删除的下一位开始
	//print_r($arr);
	while(!$flag){
		foreach($arr['data'] as $k => $v){
			if($jump){
				if($k == $arr['start']){
					$jump = false;
				} else {
					continue;
				}
			}
			$n++;
			if($n == $count){
				unset($arr['data'][$k]);
			}
			if($n == $count+1){
				$arr['start'] = $k;
				$flag = true;
				break;
			}
		}
	}
	return $arr;
}

// 约瑟夫问题
function yuesefu($arr, $n){
	$r['start'] = 0;
	$r['data'] = $arr;
	while(count($r['data']) != 1){
		$r = del($r, $n);
	}
	var_dump($r);
}

$arr= array(4,1,7,45,11,9,111);
yuesefu($arr, 6);
yuesefu($arr, 9);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值