问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

php几种排序算法实例详解

发布网友 发布时间:2022-04-22 23:00

我来回答

2个回答

热心网友 时间:2022-04-06 01:55

下面给你介绍四种排序方法:

1) 插入排序(Insertion Sort)的基本思想是: 
每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。实现代码如下:

2) 选择排序(Selection Sort)的基本思想是: 
每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。实现代码如下:

3) 冒泡排序的基本思想是: 
两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。实现代码如下:

4) 快排也是一个高效的排序算法,它的时间复杂度也是O(nlogn)。原理是:选择一个基准元素,然后把数组中小于这个元素的元素放在基准元素左边,大于它的,放在基准元素右边。然后对这两边继续同样的操作。代码如下:

热心网友 时间:2022-04-06 03:13

四种排序算法的PHP实现:
1) 插入排序(Insertion Sort)的基本思想是: 
每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。

2) 选择排序(Selection Sort)的基本思想是: 
每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。

3) 冒泡排序的基本思想是: 
两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。

4) 快速排序实质上和冒泡排序一样,都是属于交换排序的一种应用。所以基本思想和上面的冒泡排序是一样的。

1. sort.php文件如下:

<?php
class Sort {
  private $arr  = array(); 
  private $sort  = 'insert';
  private $marker = '_sort';
  private $debug = TRUE;
  /**
   * 构造函数
   *
   * @param  array  例如:
   $config = array (
   'arr' => array(22,3,41,18) , //需要排序的数组值
   'sort' => 'insert', //可能值: insert, select, bubble, quick
   'debug' => 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;  
  }
  /**
   * 快速排序
   * @by www.5wx.org
   * @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 = 'date[' . date('Y-m-d H:i:s') . '] ' . $msg . '\n';
    return @file_put_contents('sort_err.log', $msg, FILE_APPEND);
  }
}
/*End of file sort.php*/
/*Location htdocs/sort.php */
2. sort_demo.php文件如下:

<?php
require_once('sort.php');
$config = array (
  'arr' => array(23, 22, 41, 18, 20, 12, 200303,2200,1192) ,
  //需要排序的数组值
  'sort' => 'select',
  //可能值: insert, select, bubble, quick
  'debug' => TRUE
  //可能值: TRUE, FALSE
);
$sort = new Sort($config);
//var_mp($config['arr']);
var_mp($sort->display());
/*End of php*/

php几种排序算法实例详解

四种排序算法的PHP实现:1) 插入排序(Insertion Sort)的基本思想是: 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。2) 选择排序(Selection Sort)的基本思想是: 每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文...

PHP实现常见的排序算法

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在...

php二维数组排序方法

PHP二维数组排序可以通过多种方法实现,常见的包括冒泡排序、插入排序、选择排序以及内置的数组函数如array_multisort等。此外,也可以通过使用usort等用户自定义的排序函数对关联数组的键或值进行排序。解释如下:冒泡排序:这是一种简单的排序算法,通过不断地比较和交换相邻元素来将最大值或最小值移动到序...

PHP快速排序算法实现的原理及代码详解

步骤:从数组中选个基准值 将数组中大于基准值的放同一边、小于基准值的放另一边,基准值位于中间位置 递归的对分列两边的数组再排序 代码实现 function quickSort($arr){ len = count($arr);if ($len &lt;= 1){ return arr;} v = arr[0];low = up = array();for ($i = 1;i &lt; len;...

用“自然排序”算法对数组进行不区分大小写字母的排序?

(PHP 4, PHP 5, PHP 7)natcasesort — 用“自然排序”算法对数组进行不区分大小写字母的排序 说明 natcasesort ( array &amp;$array ) : bool natcasesort() 是 natsort() 函数的不区分大小写字母的版本。本函数实现了一个和人们通常对字母数字字符串进行排序的方法一样的排序算法并保持原有键/值的...

php:树形结构的算法

层级结构的数据保存在平面的数据库中基本上有两种常用设计方法:毗邻目录模式(adjacency list model)预排序遍历树算法(modified preorder tree traversal algorithm)我不是计算机专业的,也没有学过什么数据结构的东西,所以这两个名字都是我自己按照字面的意思翻的,如果说错了还请多多指教。这两个东西听...

PHP工程师面试常见问题有哪些

(6)数据结构与算法能力。基本的排序方法,如冒泡排序、快速排序、二分查找排序;或者给你一道题,手写一个方法,去实现效果,比如100元分给10个人,每人至少6元,最多12元,必须分完100元。最常问到树的遍历和排序。(7)服务器安全问题:sql注入、xss攻击等。编程时如何预防这些问题。(8)框架...

php 获取二位数组中某一个元素最小的值

第一个是自己写个排序算法,将二维数组按照指定的键排序,如persiods,这样的方法网上多的是,大致过程如下(自己修改验证,我这里不是很方便进行运行):// 使用冒泡排序法进行排序 function sortMultiArray($arr, $key) { len = count($arr);for ($i=0; $i&lt;$len-1; $i++) { for ($j=$...

希尔排序图解流程图

常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。以下是希尔排序算法: 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的...

strnatcmp — 使用自然排序算法比较字符串?

(PHP 4, PHP 5, PHP 7, PHP 8)strnatcmp — 使用自然排序算法比较字符串 说明 strnatcmp ( string $str1 , string $str2 ) : int 该函数实现了以人类习惯对数字型字符串进行排序的比较算法,这就是“自然顺序”。注意该比较区分大小写。参数 str1 第一个字符串。str2 第二个字符串。返回值...

几种排序算法比较 php排序算法 php开发排序算法 快速排序算法php 排序算法python 快速排序算法c语言实现 哪种排序算法最快 php四种排序 排序算法
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
偶想知道这个视频那个背景音乐是啥米~ 青岛哪家婚纱摄影好 关山村地理 失独家庭补贴蔡芳再婚后还有没有了 失独家庭领养了一个孩子后能享受独生子女政策吗 为什么失独家庭领养了小孩政府就不扶助了 给领导写信最好用什么字体 无线网卡和无线上网卡的区别? 笔记本无线上网选什么好???/ 我有一个爱国者MP3,可将数据线插入电脑后,MP3有反应,电脑上面却什么也没... 笔记本无线上网需要哪几个条件?? 卖1斤亏1元,苹果价格大跌滞销,这其中的因素有哪些? 苹果销售价格越来越两极分化,对此你怎么看? 苹果的价格还会往上走吗? 今年的苹果销量不行,这是为什么呢? 苹果价格大跌滞销,遭历史最严重行情,这是受哪些因素所影响? 我国苹果遭史上最严重行情,今年的苹果为何销售不出去? 隐形眼镜怎么用啊? 金立智能手机现在怎样? 配隐形眼镜 大概多少钱? 你觉得金立手机怎么样? 隐形眼镜有几种? 隐形眼镜的材质究竟是什么啊? 隐形眼镜哪个牌子好? 金立F40手机质量怎么样? 隐形眼镜的危害有哪些(详细的) 戴隐形眼镜有什么好处和坏处? 隐形眼镜在哪里配? 隐形眼镜什么牌子比较好? 彩色透水混凝土施工方法是什么? 彩色混凝土压花工艺(怎么做 冷库苹果销售遇“寒潮”,明年的苹果行情如何呢? 苹果12元一斤,果农却面临销售难,钱都被谁赚走了? php快速排序算法 苹果行情20年来最差,你怎么看? iphone 12价格下降幅度为什么这么大呢? PHP快速排序算法实现的原理及代码详解 如何使用强大的PHP函数对数组进行排序 烟台苹果行情是怎样的? PHP中的快速排序算法如何实现倒序? php数组排序有很多的方法,哪位可以详细的分解一二吗,如用函数和不用函 ... 美国苹果股市一直都在上升的原因? PHP 怎么用冒泡算法进行排序呢 为什么不能用保温杯泡茶? 运用经济生活的知识预测苹果手机价格可能走势并说明理由 关于PHP冒泡排序法。 php数组随机排序几种方法 用保温杯泡茶好不好? 供求理论分析为什么苹果在消费旺季价格下降,海边别墅却在消费旺季价格上升 php中对一组数字从大到小排序方法 苹果市场价多少