<?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);
常见算法题 php实现
最新推荐文章于 2021-03-10 01:27:15 发布