• 常用的算法


    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:




  • 相关阅读:
    Android Studio 工具栏添加图标
    Spring 概述
    Spring的一种拦截器SimpleUrlHandlerMapping
    Spring注解@Resource和@Autowired区别对比
    关于spring中注解和xml混合使用
    MyEclipse快捷键大全(绝对全)
    技术简历
    计算坐标中心点
    Ideal常用 快捷键
    Ideal 报错之 Class ** is never used 解决办法
  • 原文地址:https://www.cnblogs.com/datang6777/p/7060068.html
Copyright © 2020-2023  润新知