php 排序方式和二分查找


<?php

//定義一個數組

$arr(1,11,43,54,62,21,66,32,78,36,76,39);

 

冒泡排序

function  bubbleSort( $arr )
{
  $len = count ( $arr );
  //該層循環控制 需要冒泡的輪數
  for ( $i =1; $i < $len ; $i ++)
  //該層循環用來控制每輪 冒出一個數 需要比較的次數
  for ( $k =0; $k < $len - $i ; $k ++)
  {
   if ( $arr [ $k ]> $arr [ $k +1])
   {
    $tmp = $arr [ $k +1];
    $arr [ $k +1]= $arr [ $k ];
    $arr [ $k ]= $tmp ;
   }
  }
  }
  return  $arr ;
}
 
選擇排序
function  selectSort( $arr ) {
//雙重循環完成,外層控制輪數,內層控制比較次數
  $len = count ( $arr );
  for ( $i =0;  $i < $len -1;  $i ++) {
  //先假設最小的值的位置
  $p  $i ;
  for ( $j = $i +1;  $j < $len $j ++) {
   //$arr[$p] 是當前已知的最小值
   if ( $arr [ $p ] >  $arr [ $j ]) {
   //比較,發現更小的,記錄下最小值的位置;並且在下次比較時采用已知的最小值進行比較。
   $p  $j ;
   }
  }
  //已經確定了當前的最小值的位置,保存到$p中。如果發現最小值的位置與當前假設的位置$i不同,則位置互換即可。
  if ( $p  !=  $i ) {
   $tmp  $arr [ $p ];
   $arr [ $p ] =  $arr [ $i ];
   $arr [ $i ] =  $tmp ;
  }
  }
  //返回最終結果
  return  $arr ;
}
 
 
插入排序
 
function  insertSort( $arr ) {
  $len = count ( $arr );
  for ( $i =1,  $i < $len $i ++) {
  $tmp  $arr [ $i ];
  //內層循環控制,比較並插入
  for ( $j = $i -1; $j >=0; $j --) {
   if ( $tmp  $arr [ $j ]) {
   //發現插入的元素要小,交換位置,將后邊的元素與前面的元素互換
   $arr [ $j +1] =  $arr [ $j ];
   $arr [ $j ] =  $tmp ;
   else  {
   //如果碰到不需要移動的元素,由於是已經排序好是數組,則前面的就不需要再次比較了。
   break ;
   }
  }
  }
  return  $arr ;
}
 
快速排序
 
function  quickSort( $arr ) {
  //先判斷是否需要繼續進行
  $length  count ( $arr );
  if ( $length  <= 1) {
  return  $arr ;
  }
  //選擇第一個元素作為基准
  $base_num  $arr [0];
  //遍歷除了標尺外的所有元素,按照大小關系放入兩個數組內
  //初始化兩個數組
  $left_array  array ();  //小於基准的
  $right_array  array ();  //大於基准的
  for ( $i =1;  $i < $length $i ++) {
  if ( $base_num  $arr [ $i ]) {
   //放入左邊數組
   $left_array [] =  $arr [ $i ];
  else  {
   //放入右邊
   $right_array [] =  $arr [ $i ];
  }
  }
  //再分別對左邊和右邊的數組進行相同的排序處理方式遞歸調用這個函數
  $left_array  = quick_sort( $left_array );
  $right_array  = quick_sort( $right_array );
  //合並
  return  array_merge ( $left_array array ( $base_num ),  $right_array );
}
 
二分查找法
 

function A($arr, $target)
{
  //定義開始和結束的下標
  $start = 0;
  $end = count($arr) - 1;
  //循環
  while($start <= $end)
  {
    //取中間值
    $mid = floor(($start + $end) / 2);
    if($arr[$mid] == $target)
    {
      return $mid;
    }
    //查詢的數小,往左繼續查找
    if($arr[$mid] > $target)
    {
      $end = $mid - 1;
    }
    //查詢的數大,往右繼續查找
    if($arr[$mid] < $target)
    {
      $start = $mid + 1;
    }
  }
}
echo A($arr, 11);

?>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM