常用的算法
1.冒泡
function bubbleSort($arr){
//进行N轮循环
for($n = count($arr)-1; $n > 0 ; $n --){
//每一轮循环需要进行的比较次数
for ($i = 0 ; $i < $n ; $i++){
//如果
if($arr[$i]<$arr[$i+1] ){
$temp = $arr[$i+1];
$arr[$i+1] = $arr[$i] ;
$arr[$i] = $temp;
echo '第'.$i.'个元素和后一个元素交换位置后'.$arr[$i].','. $arr[$i+1].'<br/>';
}else{
echo '第'.$i.'个元素和后一个元素不需要交换位置'.$arr[$i].','. $arr[$i+1].'<br/>';
}
}
2.快速排序
<?php
header('Content-type:text/html;charset= utf-8');
function quickSort($arr){
if(count($arr) <=1){
return $arr;
}
$result = array();
$element = $arr[0];
$left = array();
$right =array();
for($i = 1; $i < count($arr); $i++){
if($arr[$i] > $element){
$right[] = $arr[$i];
}else{
$left[] = $arr[$i];
}
}
echo 'right:';
foreach($left as $n){
echo $n.',';
}
echo ' center:'.$element.', right:';
foreach ($left as $n) {
echo $n.',';
}
echo '<br>';
$left = quickSort($left);
$right = quickSort($right);
return array_merge($right, array($element), $left);
}
$arr = array(4,3,9,7,6);
$arr2 = quickSort($arr);
echo '<pre>';
print_r($arr2);
?>
3.插入排序
<?php
echo '<pre>';
header('Content-Type:text/html;charset = utf-8');
/*4 3 9 7 6
4 3 9 7 6
34 9 7 6
349 76
3469 7
34679
插入排序 ,循环N层
*/
function insertSort($arr){
//$i = 1,$j = 0;
for ($i=0; $i <count($arr) ; $i++) {
echo '<hr>';
echo '<br>本次循环要插入位置的元素位置是'.$i.',值'.$arr[$i].'<br>';
//$arr [$i] 和所有小于$i 的元素比较
for ($j=0; $j <$i ; $j++) {
//找到要插入的位置就是$j;
if($arr[$j] >= $arr[$i]){
echo '要插入的位置是'.$j.'<br>';
//先保存本次要插入的元素
$temp = $arr[$i];
//$temp =3,$arr[0]=4,$arr[1]=3;
//把所有大于$j的元素都往后移一个位置
for ($k=$i; $k >$j ; $k--) {
$arr [$k] = $arr[$k -1];//$arr[1] = $arr[0];//4
}
echo $j.'到'.$i.'之间的元素往后移<br>';
//$j放入要插入的元素
$arr[ $j ] = $temp;//$arr[0] = 3;
break;
}
//如果比较到了最后一个位置,说明要插入的位置本来就比较大不需要移动位置
if ($j ==$i -1){
echo '本次位置不变<br>';
}
}
echo 'i=='.$i.'<br>';
print_r($arr);
}
return $arr;
}
$arr = array (8,4,3,1,9,7,6);
//4 8 3 temp = 3 488 448 348
//3 4 8 1 temp =
echo '<prev>';
$arr2 =insertSort($arr);
print_r($arr2);
?>
4.选择排序
<?php
header('Content-Type:text/html;charset=utf-8');
/*
选择排序
//6,3,9,4
//第一轮4次比较 temp 6 3 9 4 temp=9 634/9
//第二轮3次比较 temp 6 3 4 9 temp=6 43/69
//第三轮2次比较 temp 4 3 6 9 temp=4 3/469
//第四轮 3469
*/
function selectSort($arr) {
//每一轮都选择一个剩余元素中的最大值
$count = count($arr);
for ($n = $count; $n > 0; $n--) {
//选择一个最大值,并和最后一个位置交换
$temp = 0;
$k = 0;
for ($i = $count-$n; $i < $count; $i++) {
if ($arr[$i] > $temp) {
$temp = $arr[$i];
$k = $i;
}
}
//交换 $k 和 本轮循环的最后一个元素
$arr[$k] = $arr[$count-$n];
$arr[$count-$n] = $temp;
//交换temp和最后一个元素的值,可能需要另外的变量存储key
var_dump($arr);
}
return $arr;
}
echo '<pre>';
$arr = array(12,6,3,9,4);
print_r($arr);
$arr2 = selectSort($arr);
?>
5.二分查找顺序查找
<?php
class search
{
// 查找的源数组
private $array = array(1, 2, 3, 5, 7, 6, 4, 8);
/**
* 顺序查找法
* @param $val 要查找的值
*/
public function query_search($val)
{
foreach ($this->array as $k => $v) {
if ($v == $val) {
echo '顺序查找成功!';
exit(0);
}
}
echo '顺序查找失败!';
}
/**
* 二分查找法
* @param $val 要查找的值
*/
public function bin_search($val)
{
sort($this->array);
$min = 0;
$max = count($this->array);
for ($i = $min; $i < $max; $i++) {
$mid = ceil(($min + $max) / 2);
if ($val == $this->array[$mid]) {
echo '二分查找成功!';
exit(0);
} else if ($val < $this->array[$mid]) {
$max = $mid;
} else if ($val > $this->array[$mid]) {
$min = $mid;
}
}
echo '二分查找失败!';
}
}
1.求第N个 1,1,2,3,5,8,13,-------
function a($n){
if ($n <= 0) {
return 0;
} elseif ($n == 1) {
return 1;
} else {
return a($n - 1) + a($n - 2);
}
}
echo a(4);
2.求1000以内的奇数和
$sum = 0;
for($i = 1;$i<=1000;$i++)
{
if($i%2 != 0)
{
$sum += $i;
}
}
echo $sum;
3.求1000以内数的和
$sum = 0;
for($i=1;$i<=100;$i++){
$sum += $i;
}
echo $sum;
4.给定一个数组,求出数组中差最小的两个数 比如[1,3,4,56,24,245,244]
先留着,评论区可以的小伙伴先上解
5.背包算法
<?php
//背包承重上限
$limit = 8;
//物品种类
$total = 5;
//物品
$array = array(
array("栗子", 4, 4500),
array("苹果", 5, 5700),
array("橘子", 2, 2250),
array("草莓", 1, 1100),
array("甜瓜", 6, 6700)
);
//存放物品的数组
$item = array_fill(0, $limit + 1, 0);
//存放价值的数组
$value = array_fill(0, $limit + 1, 0);
$p = $newvalue = 0;
for ($i = 0; $i < $total; $i++) {
for ($j = $array[$i][1]; $j <= $limit; $j++) {
$p = $j - $array[$i][1];
$newvalue = $value[$p] + $array[$i][2];
//找到最优解的阶段
if ($newvalue > $value[$j]) {
$value[$j] = $newvalue;
$item[$j] = $i;
}
}
}
echo "物品 价格<br />";
for ($i = $limit; 1 <= $i; $i = $i - $array[$item[$i]][1]) {
echo $array[$item[$i]][0] . " " . $array[$item[$i]][2] . "<br />";
}
echo "合计 " . $value[$limit];
//
<?php
//0-1背包贪心算法问题
class tanxin{
public $weight;
public $price;
public function __construct($weight=0,$price=0)
{
$this->weight=$weight;
$this->price=$price;
}
}
//生成数据
$n=10;
for($i=1;$i<=$n;$i++){
$weight=rand(1,20);
$price=rand(1,10);
$x[$i]=new tanxin($weight,$price);
}
//输出结果
function display($x)
{
$len=count($x);
foreach($x as $val){
echo $val->weight,' ',$val->price;
echo '<br>';
}
}
//按照价格和重量比排序
function tsort(&$x)
{
$len=count($x);
for($i=1;$i<=$len;$i++)
{
for($j=1;$j<=$len-$i;$j++)
{
$temp=$x[$j];
$res=$x[$j+1]->price/$x[$j+1]->weight;
$temres=$temp->price/$temp->weight;
if($res>$temres){
$x[$j]=$x[$j+1];
$x[$j+1]=$temp;
}
}
}
}
//贪心算法
function tanxin($x,$totalweight=50)
{
$len=count($x);
$allprice=0;
for($i=1;$i<=$len;$i++){
if($x[$i]->weight>$totalweight) break;
else{
$allprice+=$x[$i]->price;
$totalweight=$totalweight-$x[$i]->weight;
}
}
if($i<$len) $allprice+=$x[$i]->price*($totalweight/$x[$i]->weight);
return $allprice;
}
tsort($x);//按非递增次序排序
display($x);//显示
echo '0-1背包最优解为:';
echo tanxin($x);
10: