PHP中常用演算法以及資料結構

來源:互聯網
上載者:User
本篇文章主要介紹PHP中常用演算法以及資料結構,感興趣的小夥伴參考下,希望對大家有所協助。

</pre><pre name="code" class="php"><?php  /** * Created by PhpStorm. * User: qishou * Date: 15-8-2 * Time: 上午9:12 */header("content-type:text/html;charset=utf-8");  $arr = array(3,5,8,4,9,6,1,7,2);  echo implode(" ",$arr)."<br/>";  //---------------------------------------//              常用排序演算法//---------------------------------------//冒泡排序function BubbleSort($arr){      $length = count($arr);      if($length<=1){          return $arr;      }      for($i=0;$i<$length;$i++){          for($j=$length-1;$j>$i;$j--){              if($arr[$j]<$arr[$j-1]){                  $tmp = $arr[$j];                  $arr[$j] = $arr[$j-1];                  $arr[$j-1] = $tmp;              }          }      }      return $arr;  }  echo '冒泡排序:';  echo implode(' ',BubbleSort($arr))."<br/>";  //快速排序function QSort($arr){      $length = count($arr);      if($length <=1){          return $arr;      }      $pivot = $arr[0];//樞軸    $left_arr = array();      $right_arr = array();      for($i=1;$i<$length;$i++){//注意$i從1開始0是樞軸        if($arr[$i]<=$pivot){              $left_arr[] = $arr[$i];          }else{              $right_arr[] = $arr[$i];          }      }      $left_arr = QSort($left_arr);//遞迴排序左半部分    $right_arr = QSort($right_arr);//遞迴排序右半部份    return array_merge($left_arr,array($pivot),$right_arr);//合并左半部分、樞軸、右半部分}  echo "快速排序:";  echo implode(' ',QSort($arr))."<br/>";  //選擇排序(不穩定)function SelectSort($arr){      $length = count($arr);      if($length<=1){          return $arr;      }      for($i=0;$i<$length;$i++){          $min = $i;          for($j=$i+1;$j<$length;$j++){              if($arr[$j]<$arr[$min]){                  $min = $j;              }          }          if($i != $min){              $tmp = $arr[$i];              $arr[$i] = $arr[$min];              $arr[$min] = $tmp;          }      }      return $arr;  }  echo "選擇排序:";  echo implode(' ',SelectSort($arr))."<br/>";  //插入排序function InsertSort($arr){      $length = count($arr);      if($length <=1){          return $arr;      }      for($i=1;$i<$length;$i++){          $x = $arr[$i];          $j = $i-1;          while($x<$arr[$j] && $j>=0){              $arr[$j+1] = $arr[$j];              $j--;          }          $arr[$j+1] = $x;      }      return $arr;  }  echo '插入排序:';  echo implode(' ',InsertSort($arr))."<br/>";  //---------------------------------------//              常用尋找演算法//---------------------------------------//二分尋找function binary_search($arr,$low,$high,$key){      while($low<=$high){          $mid = intval(($low+$high)/2);          if($key == $arr[$mid]){              return $mid+1;          }elseif($key<$arr[$mid]){              $high = $mid-1;          }elseif($key>$arr[$mid]){              $low = $mid+1;          }      }      return -1;  }  $key = 6;  echo "二分尋找{$key}的位置:";  echo binary_search(QSort($arr),0,8,$key);  //順序尋找function SqSearch($arr,$key){      $length = count($arr);      for($i=0;$i<$length;$i++){          if($key == $arr[$i]){              return $i+1;          }      }      return -1;  }  $key = 8;  echo "<br/>順序常規尋找{$key}的位置:";  echo SqSearch($arr,$key);  //---------------------------------------//              常用資料結構//---------------------------------------//線性表的刪除(數組實現)function delete_array_element($arr,$pos){      $length = count($arr);      if($pos<1 || $pos>$length){          return "刪除位元置出錯!";      }      for($i=$pos-1;$i<$length-1;$i++){          $arr[$i] = $arr[$i+1];      }      array_pop($arr);      return $arr;  }  $pos = 3;  echo "<br/>除第{$pos}位置上的元素後:";  echo implode(' ',delete_array_element($arr,$pos))."<br/>";  /** * Class Node * PHP類比鏈表的基本操作 */class Node{      public $data = '';      public  $next = null;  }  //初始化function init($linkList){      $linkList->data = 0; //用來記錄鏈表長度    $linkList->next = null;  }  //頭插法建立鏈表function createHead(&$linkList,$length){      for($i=0;$i<$length;$i++){          $newNode = new Node();          $newNode->data = $i;          $newNode->next = $linkList->next;//因為PHP中對象本身就是引用所以不用再可用“&”        $linkList->next = $newNode;          $linkList->data++;      }  }  //尾插法建立鏈表function createTail(&$linkList,$length){      $r = $linkList;      for($i=0;$i<$length;$i++){          $newNode = new Node();          $newNode->data = $i;          $newNode->next = $r->next;          $r->next = $newNode;          $r = $newNode;          $linkList->data++;      }  }  //在指定位置插入指定元素function insert($linkList,$pos,$elem){      if($pos<1 && $pos>$linkList->data+1){          echo "插入位置錯誤!";      }      $p = $linkList;      for($i=1;$i<$pos;$i++){          $p = $p->next;      }      $newNode = new Node();      $newNode->data = $elem;      $newNode->next = $p->next;      $p->next = $newNode;  }  //刪除指定位置的元素function delete($linkList,$pos){      if($pos<1 && $pos>$linkList->data+1){          echo "位置不存在!";      }      $p = $linkList;      for($i=1;$i<$pos;$i++){          $p = $p->next;      }      $q = $p->next;      $p->next = $q->next;      unset($q);      $linkList->data--;  }  //輸出鏈表資料function show($linkList){      $p = $linkList->next;      while($p!=null){          echo $p->data." ";          $p = $p->next;      }      echo '<br/>';  }  $linkList = new Node();  init($linkList);//初始化createTail($linkList,10);//尾插法建立鏈表show($linkList);//列印出鏈表insert($linkList,3,'a');//插入show($linkList);  delete($linkList,3);//刪除show($linkList);  /** * Class Stack * 用PHP類比順序棧的基本操作 */class Stack{      //用預設值直接初始化棧了,也可用構造方法初始化棧    private $top = -1;      private $maxSize = 5;      private $stack = array();      //入棧    public function push($elem){          if($this->top >= $this->maxSize-1){              echo "棧已滿!<br/>";              return;          }          $this->top++;          $this->stack[$this->top] = $elem;      }      //出棧    public function pop(){          if($this->top == -1){              echo "棧是空的!";              return ;          }          $elem = $this->stack[$this->top];          unset($this->stack[$this->top]);          $this->top--;          return $elem;      }      //列印棧    public function show(){          for($i=$this->top;$i>=0;$i--){              echo $this->stack[$i]." ";          }          echo "<br/>";      }  }  $stack = new Stack();  $stack->push(3);  $stack->push(5);  $stack->push(8);  $stack->push(7);  $stack->push(9);  $stack->push(2);  $stack->show();  $stack->pop();  $stack->pop();  $stack->pop();  $stack->show();  /** * Class Deque * 使用PHP實現雙向隊列 */class Deque{      private $queue = array();      public function addFirst($item){//頭入隊        array_unshift($this->queue,$item);      }      public function addLast($item){//尾入隊        array_push($this->queue,$item);      }      public function removeFirst(){//頭出隊        array_shift($this->queue);      }      public function removeLast(){//尾出隊        array_pop($this->queue);      }      public  function show(){//列印        foreach($this->queue as $item){              echo $item." ";          }          echo "<br/>";      }  }  $deque = new Deque();  $deque->addFirst(2);  $deque->addLast(3);  $deque->addLast(4);  $deque->addFirst(5);  $deque->show();  //PHP解決約瑟夫環問題//方法一function joseph_ring($n,$m){      $arr = range(1,$n);      $i = 0;      while(count($arr)>1){          $i=$i+1;          $head = array_shift($arr);          if($i%$m != 0){ //如果不是則重新壓入數組            array_push($arr,$head);          }      }      return $arr[0];  }  //方法二function joseph_ring2($n,$m){      $r = 0;      for($i=2;$i<=$n;$i++){          $r = ($r+$m)%$i;      }      return $r + 1;  }  echo "<br/>".joseph_ring(60,5)."<br/>";  echo "<br/>".joseph_ring2(60,5)."<br/>";

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.