## 快速排序
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);
}
}
加粗样式