php基本算法

## 快速排序
function quickSort($arr){
	if(count($arr) <= 1){
		return $arr;
	}
	$len = count($arr);
	$base = $arr[0]; //取第一个值作为中间值
	$left = [];
	$right = [];
	for($i=1;$i<$len;$i++){
		if($arr[$i] < $base){
			$left[] = $arr[$i];
		}else{
			$right[] = $arr[$i];
		}
	}
	return array_merge(quickSort($left),[$base], quickSort($right));
}
2.插入排序
function insertSort($arr){
	$len = count($arr);
	for($i=1;$i<$len;$i++){
		for($j=$i-1;$j>=0;$j--){
			if($arr[$j] > $arr[$j+1]){
				$tmp = $arr[$j];
				$arr[$j] = $arr[$j+1];
				$arr[$j+1] = $tmp;
			}else{
				break;
			}
		}
	}
	return $arr;
}
3.选择排序
function selSort($arr){
  $len = count($arr);//计算数组长度
  for($i=0;$i<$len;$i++){
	 $minIndex = $i; //暂时认为最小值的下标是$i
     for($j=$i+1;$j<$len;$j++){
	    if($arr[$minIndex] > $arr[$j]){
			 $minIndex = $j;
		}
	 }
	 if($minIndex != $i){
		//交换位置
		$tmp = $arr[$minIndex];
		$arr[$minIndex] = $arr[$i];
		$arr[$i] = $tmp;
	 }
  }
	return $arr;
}
4.冒泡排序
function buSort($arr){
	$len = count($arr);//计算数组长度

	for($j=1;$j<$len;$j++){

		for($i=0;$i<$len -$j;$i++){

			if($arr[$i] > $arr[$i+1]){
				//交换位置
				$tmp = $arr[$i]; //将$arr[0] 赋值给临时变量
				$arr[$i] = $arr[$i+1];
				$arr[$i+1] = $tmp;
			}
		}
	}
	return $arr;
}
5.阶乘 1*2*3*4*5*6..*n
//非递归计算
function jc($n){
	$num = 1;
	for($i=1;$i<=$n;$i++){
		$num *= $i;
	}
	return $num;
}

//递归计算
function jc2($n){
	if($n == 1){
		return 1;
	}
	return $n * jc2($n -1 );
}

6.斐波那契数列 1 1 2  3 5 8 13 21 34
//方式一 非递归
function getlist($n){
	if($n==1){
		return [1];
	}
	if($n==2){
		return [1,1];
	}
	$arr = [1,1];
	for($i=2;$i<$n;$i++){
		$arr[$i] = $arr[$i-1] + $arr[$i-2];
	}

	return $arr;
}

//方式二 递归 
function getlist2($n){
	if($n==1){
		return [1];
	}
	if($n==2){
		return [1,1];
	}
	$tmp = getlist2($n -1);
	$tmp[] = $tmp[count($tmp) -1 ] + $tmp[count($tmp) -2 ];
	return $tmp;
}
7.约瑟夫环(猴子选大王)
//方式一
function getKing($n,$m){
	$arr = [];
	for($i=1;$i<=$n;$i++){
		$arr[$i] = $i;
	}
	$j = 1;
	while(count($arr) > 1){
		if($j % $m != 0){
			$arr[] = $arr[$j];
		}
		unset($arr[$j]);
		$j++;
	}
	return $arr;
}
//方式二 数组处理函数
function getKiing($n ,$m){
        $arr = range(1,$n);//构造一个数组
        $i = 1; //从第一个开始循环
        while(count($arr)>1){ //如果总数大于1
            ($i % $m != 0) {
                array_push($arr,$arr[$i-1]);//不被踢出则压入数组尾部
            } 
            unset($arr[$i-1]);//压入数组然后删除
            $i++;//继续循环
        }  
        return $arr[$i-1]; //直至最后剩下一个为大王 
}
8.双向队列  链表  栈
/*
双向队列  链表 栈  共8个方法 其中前四个方法是必须的   不同的调用方式可以实现不同的数据结构
先进先出 先进后出  等都可以实现
*/
 class Deque{
        public $queue = [];
        /**
         * 左侧入队  尾部入队
         */
        public function lpush($value){
            return array_push($this->queue,$value);
        }
        /**
         * 左侧出队 尾部出队
         */
        public function lpop(){
            return array_pop($this->queue);
        }
        /**
         * 右侧入队 头部入队
         */
        public function rpush($value){
            return array_unshift($this->queue, $value);
        }
        /**
         * 右侧出队 头部出队
         */
        public function rpop(){
            return array_shift($this->queue);
        }
        /**
         * 清空队列
         */
        public function makeEmpty(){
            unset($this->queue);
        }
        /**
         * 获取列头
         */
        public function getFirst(){
            return reset($this->queue);
        }
        /**
         * 获取列尾
         */
        public function getLast(){
            return end($this->queue);
        }
        /**
         * 获取长度
         */
        public function getLength(){
            return count($this->queue);
        }
    }

加粗样式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值