php实现双向队列
class Deque{
private $queue = [];
public function addFirst($item)
{
return array_unshift($this->queue,$item);
}
public function addLast($item)
{
return array_push($this->queue,$item);
}
public function removeFirst()
{
return array_shift($this->queue);
}
public function removeLast()
{
return array_pop($this->queue);
}
}
冒泡排序
// 冒泡排序
function bubble_sort($arr){
$len = count($arr);
if($len <= 1){
return $arr;
}
for ($i = 0;$i < $len;$i++){ // 轮数
for ($j = 1;$j < $len - $i; $j++){ // 本轮循环对比
if($arr[$j-1] > $arr[$j]){
$temp = $arr[$j-1];
$arr[$j-1] = $arr[$j];
$arr[$j] = $temp;
}
}
}
return $arr;
}
$arr = [10,2,36,14,10,25,23,85,99,45];
$arr = bubble_sort($arr);
print_r($arr);
冒泡排序2
function bubble_sort($arr){
$length = count($arr);
if ($length <= 1) {
return $arr;
}
for ( $i=0; $i<$length-1; $i++ ) {//轮数
for ($j=0;$j<$length-1-$i;$j++){//本轮循环对比
if($arr[$j]>$arr[$j+1]){
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
}
}
}
return $arr;
}
echo '<pre>';
print_r(bubble_sort($arr));
echo '</pre>';
快速排序
// 快速排序
function quick_sort($arr){
$len = count($arr);
if($len <= 1){
return $arr;
}
$init = $arr[0];
$left_arr = [];
$right_arr = [];
for ($i=1;$i<$len;$i++){
if($arr[$i] >= $init){
$right_arr[] = $arr[$i];
}else{
$left_arr[] = $arr[$i];
}
}
$left_arr = quick_sort($left_arr);
$right_arr = quick_sort($right_arr);
return array_merge($left_arr,[$init],$right_arr);
}
print_r(quick_sort([111,10,2,36,14,10,25,23,85,99,45]));
约瑟夫环
// 一群猴子排成一圈,按1,2,...,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n,输出最后那个大王的编号。
function king($n,$m){
$mokey = range(1,$n);
$i = 0;
while (count($mokey) > 1){
$i += 1;
$head = array_shift($mokey);
if($i % $m != 0){
#如果不是m的倍数,则把猴子返回尾部,否则就抛掉,也就是出列
array_push($mokey,$head);
}
}
return $mokey[0];
}
print_r(king(10,7));
// 9
二维数组排序
// 二维数组排序,$arr是数据,$keys是排序的健值,$order是排序规则,1是降序,0是升序
function array_sort(array $arr,string $keys,int $order = 0){
$arr_keys = [];
foreach ($arr as $key=>$value){
$arr_keys[$key] = $value[$keys];
}
// 关联数组排序,保持键值关系
if($order == 0){
asort($arr_keys);
}else{
arsort($arr_keys);
}
$new_array = [];
foreach ($arr_keys as $key => $value){
$new_array[] = $arr[$key];
}
return $new_array;
}
//测试
$person=array(
array('id'=>2,'name'=>'zhangsan','age'=>23),
array('id'=>8,'name'=>'dddd','age'=>28),
array('id'=>5,'name'=>'lisi','age'=>28),
array('id'=>3,'name'=>'apple','age'=>17)
);
$result = array_sort($person,'id',1);
echo '<pre>';
print_r($result);
echo '</pre>';
顺序查找
/**
* 顺序查找
* @param array $arr 数组
* @param string $key 要查找的元素
* @return int
*/
function seq_search(array $arr,string $key){
for($i = 0;$i<count($arr);$i++){
if($arr[$i] == $key){
return $i;
}
}
return -1;
}
二分查找法
/**
* 二分查找,要求需要先排好序
* @param array $arr 排好序的数组
* @param int $low 数组起始元素下标
* @param int $high 数组末尾元素下标
* @param mixed $key 要查找的元素
* @return float|int 成功返回数组下标,失败返回-1
*/
function bin_search(array $arr,int $low,int $high,$key){
if($low <= $high){
$mid = intval(($low + $high) / 2);
if($key == $arr[$mid]){
return $mid;
}elseif ($key < $arr[$mid]){
return bin_search($arr,$low,$mid-1,$key);
}else{
return bin_search($arr,$mid+1,$high,$key);
}
}
return -1;
}
// 需要先对数组排好序
$arr = [5,9,15,25,34,47,55,76];
sort($arr);
$low = 0;
$high = count($arr) - 1;
echo bin_search($arr,$low,$high,55);
洗牌算法
// 洗牌算法
function wash_card($card_num){
$cards = $temp = [];
for ($i = 0;$i<$card_num;$i++){
$temp[$i] = $i;
}
for ($i = 0;$i<$card_num;$i++){
$index = rand(0,$card_num-$i-1);
$cards[$i] = $temp[$index];
unset($temp[$index]);
$temp = array_values($temp);
}
return $cards;
}
echo '<pre>';
print_r(wash_card(54));
echo '</pre>';