Loading

排序算法

冒泡排序法

冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
  function bubble_sort($arr)
  {
      $length = count($arr);
      //该层循环控制 需要冒泡的轮数
      for ($i = 1; $i < $length; $i++) {
          //该层循环用来控制每轮 冒出一个数 需要比较的次数
          for ($j = 0; $j < $length - $i; $j++) {
              if ($arr[$j] > $arr[$j + 1]) {
                  $tmp         = $arr[$j + 1];
                  $arr[$j + 1] = $arr[$j];
                  $arr[$j]     = $tmp;
              }
          }
      }
      return $arr;
  }

选择排序法

选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
  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;
  }

插入排序法

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
  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  = [];  //小于基准的
      $right_array = [];  //大于基准的
      for ($i = 1; $i < $length; $i++) {
          if ($base_num > $arr[$i]) {
              //放入左边数组
              $left_array[] = $arr[$i];
          } else {
              //放入右边
              $right_array[] = $arr[$i];
          }
      }
      //再分别对左边和右边的数组进行相同的排序处理方式递归调用这个函数
      $left_array  = quickSort($left_array);
      $right_array = quickSort($right_array);
      //合并
      return array_merge($left_array, [$base_num], $right_array);
  }

posted @ 2020-12-18 09:21  Jansang  阅读(69)  评论(0编辑  收藏  举报