php排序算法

冒泡排序
/**
   * 冒泡排序
   *
   * @param  array $value 待排序数组
   * @return array
   */
  function bubble($value = [])
  {
      $length = count($value) - 1;
      // 外循环
      for ($j = 0; $j < $length; ++$j) {
          // 内循环
          for ($i = 0; $i < $length; ++$i) {
              // 如果后一个值小于前一个值,则互换位置
              if ($value[$i + 1] < $value[$i]) {
                  $tmp = $value[$i + 1];
                  $value[$i + 1] = $value[$i];
                  $value[$i] = $tmp;
              }
          }
      }

      return $value;
  }

  /**
   * 优化冒泡排序
   *
   * @param  array $value 待排序数组
   * @return array
   */
  function bubble_better($value = [])
  {
    $flag   = true; // 标示 排序未完成
    $length = count($value)-1; // 数组长度
    $index  = $length; // 最后一次交换的索引位置 初始值为最后一位
    while ($flag) {
      $flag = false; // 假设排序已完成
      for ($i=0; $i < $index; $i++) {
        if ($value[$i] > $value[$i+1]) {
          $flag  = true; // 如果还有交换发生 则排序未完成
          $last  = $i; // 记录最后一次发生交换的索引位置
          $tmp   = $value[$i];
          $value[$i] = $value[$i+1];
          $value[$i+1] = $tmp;
        }
      }
      $index = $last;
    }

    return $value;
  }

  

选择排序
/**
  * 选择排序.
  *
  * @param  array $value 待排序数组
  *
  * @return array
  */
  function select_sort(&$value=[])
  {
    $length = count($value)-1;
    for ($i=0; $i < $length; $i++) {
      $point = $i;// 最小值索引
      for ($j=$i+1; $j <= $length; $j++) {
        if ($value[$point] > $value[$j]) {
          $point = $j;
        }
      }
      $tmp = $value[$i];
      $value[$i] = $value[$point];
      $value[$point] = $tmp;
    }
    return $value;
  }

  


插入排序
/**
  * 插入排序.
  *
  * @param  array   $value 待排序数组
  * @param  integer $point 起始位置
  *
  * @return array
  */
  function insert(&$value=[], $point=0)
  {
    if ($point >= count($value) - 1) {
      return;
    }
    $next  = $value[$point + 1]; // 下一个待插入值
    // 从后向前遍历已排序数组
    for ($i=$point; $i >= 0; --$i) {
      // 如果当前已排序值大于 待插入值
      // 把当前值后往后移动一位
      // 继续向前遍历
      if ($value[$i] > $next) {
        $value[$i+1] = $value[$i];
        // 如果到开头,自动到插入头位
        if ($i === 0) {
          $value[$i] = $next;
          break;
        }
        continue;
      }
      // 如果,当前已排序值小于或等于 待插入值
      // 则,在当前值后插入 当前待插入值
      // 特殊:如果末尾值小于或等于待插入值 则当前值后插入本身
      $value[$i+1] = $next;
      break;
    }
    $point += 1;// 已排序末尾位置

    // 递归
    insert($value, $point);

    return $value;
  }

  /**
   * 插入排序 for循环版
   *
   * @param  array   $value 待排序数组
   *
   * @return array
   */
  function insert_for($arr=array())
  {
      $len = count($arr);
      for($i = 1; $i < $len; $i++) {
          $base = $arr[$i];
          for($j = $i - 1; $j >= 0; $j--) {
              if ($base < $arr[$j]) {
                  $arr[$j + 1] = $arr[$j];
                  if ($j === 0) {
                      $arr[$j] = $base;
                      break;
                  }
                  continue;
              }
              $arr[$j + 1] = $base;
              break;
          }
      }
      return $arr;
  }

  

 

快速排序

$a = array(2,13,42,34,56,23,67,365,87665,54,68,3);

function quick_sort($a)
{
    // 判断是否需要运行,因下面已拿出一个中间值,这里<=1
    if (count($a) <= 1) {
        return $a;
    }

    $middle = $a[0]; // 中间值

    $left = array(); // 接收小于中间值
    $right = array();// 接收大于中间值

    // 循环比较
    for ($i=1; $i < count($a); $i++) { 

        if ($middle < $a[$i]) {

            // 大于中间值
            $right[] = $a[$i];
        } else {

            // 小于中间值
            $left[] = $a[$i];
        }
    }

    // 递归排序划分好的2边
    $left = quick_sort($left);
    $right = quick_sort($right);

    // 合并排序后的数据,别忘了合并中间值
    return array_merge($left, array($middle), $right);
}

print_r(quick_sort($a));

  

 
 
 
posted @ 2020-08-28 16:01  肚子圆圆  阅读(151)  评论(0编辑  收藏  举报