Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung mehrerer Beispiele für Sortieralgorithmen in PHP

Detaillierte Erläuterung mehrerer Beispiele für Sortieralgorithmen in PHP

伊谢尔伦
伊谢尔伦Original
2017-06-23 14:26:131428Durchsuche

PHP-Implementierung von vier Sortieralgorithmen:

1) Die Grundidee der Einfügungssortierung (Insertion Sort) ist:
Jedes Mal, wenn ein zu sortierender Datensatz sortiert wird Entsprechend seiner Größe wird das Schlüsselwort an der entsprechenden Position in der zuvor sortierten Unterdatei eingefügt, bis alle Datensätze eingefügt sind.

2) Die Grundidee der Auswahlsortierung ist: In jedem Durchgang wird der Datensatz mit dem kleinsten Schlüsselwort aus den zu sortierenden Datensätzen ausgewählt und die Reihenfolge wird in die Reihenfolge eingefügt sortierter Datensatz. Am Ende der sortierten Unterdatei, bis alle Datensätze sortiert sind.

3)

Die Grundidee der Blasensortierung ist: Vergleichen Sie die Schlüsselwörter der Datensätze, die paarweise sortiert werden sollen, und stellen Sie dann die Reihenfolge der beiden Datensätze fest Ist das Gegenteil der Fall, werden sie ausgetauscht, bis keine Invertierung mehr erfolgt, bis die Sequenz aufgezeichnet wird.

4) Die Schnellsortierung entspricht im Wesentlichen der Blasensortierung und ist eine Anwendung der Austauschsortierung. Die Grundidee ist also dieselbe wie bei der Blasensortierung oben.

1. Die Datei sort.php lautet wie folgt:

<?php
class Sort {
  private $arr  = array(); 
  private $sort  = &#39;insert&#39;;
  private $marker = &#39;_sort&#39;;
  private $debug = TRUE;
  /**
   * 构造函数
   *
   * @param  array  例如:
   $config = array (
   &#39;arr&#39; => array(22,3,41,18) , //需要排序的数组值
   &#39;sort&#39; => &#39;insert&#39;, //可能值: insert, select, bubble, quick
   &#39;debug&#39; => TRUE //可能值: TRUE, FALSE
   )
   */
  public function construct($config = array()) {
    if ( count($config) > 0) {
      $this->_init($config);
    }
  }
  /**
   * 获取排序结果
   */
  public function display() {
    return $this->arr;
  }
  /**
   * 初始化
   *
   * @param  array
   * @return bool
   */
  private function _init($config = array()) {
    //参数判断
    if ( !is_array($config) OR count($config) == 0) {
      if ($this->debug === TRUE) {
        $this->_log("sort_init_param_invaild");
      }
      return FALSE;
    }
    //初始化成员变量
    foreach ($config as $key => $val) {
      if ( isset($this->$key)) {
        $this->$key = $val;
      }
    }
    //调用相应的成员方法完成排序
    $method = $this->sort . $this->marker;
    if ( ! method_exists($this, $method)) {
      if ($this->debug === TRUE) {
        $this->_log("sort_method_invaild");
      }
      return FALSE;
    }
    if ( FALSE === ($this->arr = $this->$method($this->arr)))
      return FALSE;
    return TRUE;
  }
  /**
   * 插入排序
   * 
   * @param  array
   * @return bool
   */
  private function insert_sort($arr) {
    //参数判断
    if ( ! is_array($arr) OR count($arr) == 0) {
      if ($this->debug === TRUE) {
        $this->_log("sort_array(insert)_invaild");
      }
      return FALSE;
    }
    //具体实现
    $count = count($arr);
    for ($i = 1; $i < $count; $i++) {
      $tmp = $arr[$i];
      for($j = $i-1; $j >= 0; $j--) { 
        if($arr[$j] > $tmp) {
          $arr[$j+1] = $arr[$j];
          $arr[$j] = $tmp;
        }
      }
    }
    return $arr;
  }
  /**
   * 选择排序
   * 
   * @param  array
   * @return bool
   */
  private function select_sort($arr) {
    //参数判断
    if ( ! is_array($arr) OR count($arr) == 0) {
      if ($this->debug === TRUE) {
        $this->_log("sort_array(select)_invaild");
      }
      return FALSE;
    }
    //具体实现
    $count = count($arr);
    for ($i = 0; $i < $count-1; $i++) {
      $min = $i;
      for ($j = $i+1; $j < $count; $j++) {
        if ($arr[$min] > $arr[$j]) $min = $j;
      }
      if ($min != $i) {
        $tmp = $arr[$min];
        $arr[$min] = $arr[$i];
        $arr[$i] = $tmp;
      }
    }
    return $arr;
  }
  /**
   * 冒泡排序
   * 
   * @param  array
   * @return bool
   */
  private function bubble_sort($arr) {
    //参数判断
    if ( ! is_array($arr) OR count($arr) == 0) {
      if ($this->debug === TRUE) {
        $this->_log("sort_array(bubble)_invaild");
      }
      return FALSE;
    }
    //具体实现
    $count = count($arr);
    for ($i = 0; $i < $count; $i++) {
      for ($j = $count-1; $j > $i; $j--) {
        if ($arr[$j] < $arr[$j-1]) {
          $tmp = $arr[$j];
          $arr[$j] = $arr[$j-1];
          $arr[$j-1] = $tmp;
        }
      }
    }
    return $arr;  
  }
  /**
   * 快速排序
   * 
   * @param  array
   * @return bool
   */
  private function quick_sort($arr) {
    //具体实现
    if (count($arr) <= 1) return $arr; 
    $key = $arr[0];
    $left_arr = array();
    $right_arr = array();
    for ($i = 1; $i < count($arr); $i++){
      if ($arr[$i] <= $key)
        $left_arr[] = $arr[$i];
      else
        $right_arr[] = $arr[$i];
    }
    $left_arr = $this->quick_sort($left_arr);
    $right_arr = $this->quick_sort($right_arr); 
 
    return array_merge($left_arr, array($key), $right_arr);
  }
  /**
   * 日志记录
   */
  private function _log($msg) {
    $msg = &#39;date[&#39; . date(&#39;Y-m-d H:i:s&#39;) . &#39;] &#39; . $msg . &#39;\n&#39;;
    return @file_put_contents(&#39;sort_err.log&#39;, $msg, FILE_APPEND);
  }
}
/*End of file sort.php*/
/*Location htdocs/sort.php */
2. Die Datei sort_demo.php lautet wie folgt:

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung mehrerer Beispiele für Sortieralgorithmen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Was ist PHP-Puffer?Nächster Artikel:Was ist PHP-Puffer?