//约瑟夫环,使用数组模拟环形,每数过去一个,就放在数组末尾 $arr=[1,2,3,4,5,6,7,8,9]; $every=5;//每every次,就踢出一个 function kick($arr,$every){ while(true){//一直进行,直到满足停止的条件 for($i=0;$i<$every-1;$i++){//不需要踢出的次数为$every-1 if(count($arr)>=1){//必须至少有一个,保证可以按规则进行 //从数组头部踢出挪到尾部 $beshifted=array_shift($arr); array_push($arr, $beshifted); } } if(count($arr)>1){//大于一个,需要踢出 array_shift($arr); }else{ return $arr;//只有一个,则停止 } } }
<?php /* 另一种思路 */ $arr=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]; function kick($arr,$killedNum){ while(count($arr)){//只要还有元素,则继续玩 for($i=0;$i<$killedNum-1;$i++){ $shifted=array_shift($arr);//首部踢出 $arr[]=$shifted;//放末尾 } if(count($arr)>1){//不少于一个,则踢出去 array_shift($arr); }else{ return $arr;//只有一个了,就是最终了 } } } print_r(kick($arr,5));
<?php /* 冒泡排序 思路: 大循环,需要总个数-1次 小循环,第一次需要检查总个数-1次,以后逐渐减1 */ $arr=[44,64,634,745,2,6546,1,3334,54]; function bubble($arr){ $compareTime=count($arr)-1;//总共比较多少次 $changeTime=count($arr)-1;//每次比较交换多少次 for($i=0;$i<$compareTime;$i++){ for($j=0;$j<$changeTime;$j++){ if($arr[$j]>$arr[$j+1]){ $tmp=$arr[$j+1]; $arr[$j+1]=$arr[$j]; $arr[$j]=$tmp; } } $changeTime--; } return $arr; } print_r(bubble($arr));
<?php //二维数组排序 $person=array( array(‘id‘=>2,‘name‘=>‘c‘,‘age‘=>23), array(‘id‘=>5,‘name‘=>‘b‘,‘age‘=>28), array(‘id‘=>3,‘name‘=>‘apple‘,‘age‘=>17) ); function array_sort($person,$keyValue=‘name‘){ $tmpArr=[];//存储大key与小key对应值的映射 $finArr=[];//排好序的二维数组 foreach ($person as $key => $subarr) { $tmpArr[$key]=$subarr[$keyValue]; } asort($tmpArr);//asort排序,并且不去改变索引关系 foreach ($tmpArr as $key => $value) { $finArr[]=$person[$key]; } return $finArr; } $result = array_sort($person,‘age‘,1); print_r($result);
<?php /* 一种快速排序的实现 随便取一个值,把比这个值小的放一起,比这个值大的放一起 再对这两小撮值递归同上处理 直到放在一起的值不能再往下处理(没有或者只有一个) */ $arr=[44,664,3423,5646,112,54555,1,33,3,534534535,1]; function quicksort($arr){ $relativeKey=floor(count($arr)/2);//取出一个key,可以中间,也可以随机 $relativeNum=$arr[$relativeKey];//这个key对应的value unset($arr[$relativeKey]);//这个value不要参与处理 $left=[];//比value小的值 $right=[];//比value大的值 $sortedLeft=[];//比value小,已排好序的 $sortedRight=[];//比value大,已排好序的 foreach ($arr as $key => $value) { if($value<=$relativeNum){ $left[]=$value;//小的 }else{ $right[]=$value;//大的 } } if(count($left)<=1){//如果左侧是空数组或者只有一个,则处理结束 $sortedLeft=$left; }else{ $sortedLeft=quicksort($left);//递归处理 } if(count($right)<=1){//右侧同理左侧 $sortedRight=$right; }else{ $sortedRight=quicksort($right); } return array_merge($sortedLeft,[$relativeNum],$sortedRight);//排好序的左侧,中间,右侧一同返回 } print_r(quicksort($arr));