PHP 排序算法实现讲解

jopen 9年前

        所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优秀算法,得经过大量的推理和分析。

分别使用插入排序法,冒泡排序法,选择排序法,快速排序法,将下面数组中的值进行按照从小到大的顺序进行排序操作。

$arr(12,43,57,32,51,76,36,91,28,46,40);


1、插入排序法

分析:既定前面数字已经排好顺序,现在要把第n个数字插入到前面有序的数组中,使得这n个数字也是有序的放入其中,如此反复循环直至全部排好顺序。

具体代码实现如下:

$arr(12,43,57,32,51,76,36,91,28,46,40);  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;  }


2、冒泡排序法

分析:从前往后对相邻的两个数字依次进行比较调整,让较大的数字往下沉,让较小的数字往上升,即每相邻的数字进行对比排序,顺序不符合时将其调换位置。

具体代码实现如下:

$arr(12,43,57,32,51,76,36,91,28,46,40);  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;  }


3、选择排序法

分析:选出最小的一个数字与第一个位置数字交换,之后再剩余的数当中再次找到最小的数字与第二个位置交换,依此循环到倒数第二个数字和最后一个数字比较结束为止。

具体代码实现如下:

$arr(12,43,57,32,51,76,36,91,28,46,40);  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;  }


4、快速排序法

分析:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

具体代码实现如下:

$arr(12,43,57,32,51,76,36,91,28,46,40);  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);  }