php实现经典算法
冒泡:
function bub_sort($array){
$n = count($array);
for($i=0; $i<$n; $i++){
for($j=$i+1; $j<$n; $j++){
if($array[$i]>$array[$j]){
$temp = $array[$i];
$array[$i] = $array[$j];
$array[$j] = $temp;
}
}
}
var_dump($array);
}
bub_sort([3,2,1,5,7,3]);
直接插入排序:
function ins_sort($array){
$len = count($array);
for($i=1;$i<$len;$i++){
$temp = $array[$i];
for($j=$i-1;$j>=0;$j--){
if($temp<$array[$j]){
$array[$j+1] = $array[$j];
$array[$j] = $temp;
}
else{
break;
}
}
}
var_dump($array);
}
ins_sort([3,1,2,5,7,10,9,8]);
直接选择排序:
function sel_sort($array){
$len = count($array);
for($i=0;$i<$len-1;$i++){
$p = $i;
for($j=$i+1;$j<$len;$j++){
if($array[$j]>$array[$p]){
$p = $j;
}
}
$temp = $array[$p];
$array[$p] = $array[$i];
$array[$i] = $temp;
}
var_dump($array);
}
sel_sort([2,1,3,4,6,9,5,7,1]);
堆排序:
function swap(&$array,$a,$b){
$temp = $array[$a];
$array[$a] = $array[$b];
$array[$b] = $temp;
}
function buildMaxHeap(&$array,$len){
for($i=intval($len/2)-1;$i>=0;$i--){
$l = $i*2 + 1;
$max = $l;
if($len>$l){
$r = $l+1;
if($len>$r){
if($array[$r]>$array[$l]){
$max = $r;
}
}
if($array[$max]>$array[$i]){
swap($array,$max,$i);
}
}
}
}
$array = [3,2,4,5,7,1,8];
$len = count($array);
buildMaxHeap($array, $len);
for($i=$len-1;$i>0;$i--){
swap($array,$i,0);
$len--;
buildMaxHeap($array,$len);
}
var_dump($array);
快速排序:
function quick_sort($array){
$len = count($array);
if($len<2){
return $array;
}
$right = $left = [];
for($i=1;$i<$len;$i++){
if($array[$i]<$array[0]){
$left[] = $array[$i];
}
else{
$right[] = $array[$i];
}
}
$left = quick_sort($left);
$right = quick_sort($right);
return array_merge($left,[$array[0]],$right);
}
var_dump(quick_sort([2,1,2,3,6,5,7]));
归并排序:
$array = [5,4,3,8,8,1,6];
function merge_sort(&$array){
$len = count($array);
if($len<=1){
return $array;
}
$middle = intval($len/2);
$left = array_slice($array,0,$middle);
$right = array_slice($array,$middle);
merge_sort($left);
merge_sort($right);
$array = merge($right,$left);
}
function merge($right,$left){
$merge = [];
while(count($right) && count($left)){
if($right[0]>$left[0]){
$merge[] = array_shift($right);
}
else{
$merge[] = array_shift($left);
}
}
return array_merge($merge,$right,$left);
}
merge_sort($array);
var_dump($array);
基数排序:把每位数分开,高位不存在的补零。从低位开始比较,比到高位完成排序:
function base_sort(&$arr){//前提是数组都是正整数,且不为空
$bit = 1;
$len = count($arr);
for($i=0; $i<$len; $i++){
$strlen = strlen($arr[$i]);
$bit = $strlen>$bit ? $strlen : $bit;
}
for($i=0; $i<$bit-1; $i++){
$base = [];
$divisor = pow(10,$i);
for($j=0; $j<$len; $j++){
$remain = $arr[$j]/$divisor%10;
$base[$remain][] = $arr[$j];
}
$arr = [];
for($k=0; $k<=9; $k++){
if(isset($base[$k])){
$arr = array_merge($arr,$base[$k]);
}
}
}
}
$arr = [100,1,125,19999,9,808,28];
base_sort($arr);
var_dump($arr);
二分查找(时间复杂度log2n):
function bin_sch($array,$start,$end,$value){
if($start > $end){
var_dump('没有找到');
}
$mid = intval(($start + $end) / 2);
if($array[$mid] == $value){
var_dump($mid);
}
elseif($array[$mid] > $value){
bin_sch($array,$start,$mid-1,$value);
}
else{
bin_sch($array,$mid+1,$end,$value);
}
}
bin_sch([1,2,3,4,6,8],0,5,6);
顺序查找:
seq_sch([3,2,5,6,1],5,6);
function seq_sch($array,$n,$value){
for($i=0; $i<$n; $i++){
if($array[$i] == $value){
var_dump($i);exit;
}
}
var_dump('没有找到');
}
二维数组排序:
function two_array_sort($array,$key,$sort=SORT_ASC,$sort_type=SORT_NUMERIC){
if(!is_array($array)){
return false;
}
$array_key = [];
foreach($array as $value){
if(!is_array($value)){
return false;
}
$array_key[] = $value[$key];
}
array_multisort($array_key,$sort,$sort_type,$array);
var_dump($array);
}
two_array_sort([['a'=>8,'b'=>2],['a'=>9,'b'=>2],['a'=>5,'b'=>2],['a'=>8,'b'=>2],['a'=>1,'b'=>2]], 'a');
抢红包:
function qhb($num,$money){
if($money<$num*0.01){
return false;//保证每个人能有一分钱
}
for($i=1;$i<=$num;$i++){
if($i==$num){
$hb = $money;
}
else{
$max = round($money-($num-$i)*0.01, 2);//保证每个人能有一分钱
$max = round($max/($num-$i), 2);//让每个红包差距不是太大
$hb = mt_rand(0.01*100,$max*100)/100;
$money -= $hb;
}
var_dump([$i,$hb]);
}
}
qhb(5,5);