php计数排序算法的实现代码(附四个实例代码)


Posted in PHP onMarch 31, 2020

计数排序只适合使用在键的变化不大于元素总数的情况下。它通常用作另一种排序算法(基数排序)的子程序,这样可以有效地处理更大的键。

总之,计数排序是一种稳定的线性时间排序算法。计数排序使用一个额外的数组C ,其中第i个元素是待排序数组 A中值等于 i的元素的个数。然后根据数组C 来将A中的元素排到正确的位置。

通常计数排序算法的实现步骤思路是:

1.找出待排序的数组中最大和最小的元素;

2.统计数组中每个值为i的元素出现的次数,存入数组C的第i项;

3.对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);

4.反向填充目标数组:将每个元素i放在新数组的第C[i]项,每放一个元素就将C[i]减去1。

PHP计数排序算法的实现代码示例如下:

<?php
function counting_sort($my_array, $min, $max)
{
  $count = array();
  for($i = $min; $i <= $max; $i++)
  {
    $count[$i] = 0;
  }
 
  foreach($my_array as $number)
  {
    $count[$number]++;
  }
  $z = 0;
  for($i = $min; $i <= $max; $i++) {
    while( $count[$i]-- > 0 ) {
      $my_array[$z++] = $i;
    }
  }
  return $my_array;
}
$test_array = array(3, 0, 2, 5, -1, 4, 1);
echo "原始数组 :\n";
echo implode(', ',$test_array );
echo "\n排序后数组\n:";
echo implode(', ',counting_sort($test_array, -1, 5)). PHP_EOL;

输出:

原始数组 : 3, 0, 2, 5, -1, 4, 1

排序后数组 :-1, 0, 1, 2, 3, 4, 5

下面补充一个例子

1、计数排序只适用于整数在小范围内排序

<?php
$arr = [95,94,91,98,99,90,99,93,91,92];
function countSort($arr){
$max = $arr[0];
$min = $arr[0];
for($i=0;$i<count($arr);$i++){
if($arr[$i]>$max){
$max = $arr[$i];
}
if($arr[$i] < $min){
$min = $arr[$i];
}
}
try{
$frequency = new SplFixedArray($max-$min+1);
for($i=0;$i<count($arr);$i++){
if(empty($frequency[$arr[$i]-$min]))
$frequency[$arr[$i]-$min] = 0;
$frequency[$arr[$i]-$min] += 1;
}

$sum = 0;
for ($i=0; $i < count($frequency); $i++) {
$sum += $frequency[$i];
$frequency[$i] = $sum;
}

$splfixed = new SplFixedArray(count($arr));

for($i=(count($arr)-1);$i>=0;$i--){
$splfixed[$frequency[$arr[$i]-$min]-1] = $arr[$i];
$frequency[$arr[$i]-$min] -= 1;
}
}catch(RuntimeException $re){
echo "RuntimeException: ".$re->getMessage()."\n";
}
print_r($splfixed->toArray());
}
countSort($arr);
?>

输出

Array
(
    [0] => 90
    [1] => 91
    [2] => 91
    [3] => 92
    [4] => 93
    [5] => 94
    [6] => 95
    [7] => 98
    [8] => 99
    [9] => 99
)

2、php计数排序

获取序列中的最小值min和最大值max O(n)
统计min - max之间所有值在序列中的出现次数 O(n)
顺序输出min - max的所有值,次数为0不输出,其余次数为多少就输出多少 O(k) k为数据范围

例如序列为: 2, 4, 6, 9, 4, 8

min = 2, max = 9, n为6,k为8

统计出现次数为

[2 => 1, 3 => 0, 4 => 2, 5 => 0, 6 => 1, 7 => 0, 8 => 1, 9 => 1]

输出结果为

2, 4, 4, 6, 8, 9

很明显,计数排序的复杂度为O(n) + O(k),也就是和数据量和数据范围有关.
若n和k相近,则可认为是O(n)
同时,因为要统计出现次数,如果数据范围过大而数据又很稀疏,造成的空间浪费比较大

class CountSort
{
  private $originalData = [];
  private $rangeMap = [];
  private $resultData = [];

  public function __construct($original = [])
  {
    $this->originalData = $original;
  }

  public function sort()
  {
    list($min, $max) = $this->calculateDataRange();
    $this->statisticNumberOfOccurrence($min, $max);
    $this->resultData = $this->generateResult();
    return $this->resultData;
  }

  protected function calculateDataRange()
  {
    $max = null;
    $min = null;

    foreach ($this->originalData as $value) {
      if (!is_null($max)) {
        if ($value > $max) {
          $max = $value;
        }
      } else {
        $max = $value;
      }

      if (!is_null($min)) {
        if ($value < $min) {
          $min = $value;
        }
      } else {
        $min = $value;
      }
    }

    return [$min, $max];
  }

  protected function statisticNumberOfOccurrence($min, $max)
  {
    for ($i = $min; $i <= $max; $i++) {
      $this->rangeMap[$i] = 0;
    }

    foreach ($this->originalData as $value) {
      $this->rangeMap[$value]++;
    }
  }

  protected function generateResult()
  {
    $result = [];

    foreach ($this->rangeMap as $key => $value) {
      if ($value != 0) {
        for ($i = 0; $i < $value; $i++) {
          array_push($result, $key);
        }
      }
    }
    return $result;
  }
}

$testData = [2, 3, 4, 3, 10, 30, 20, 15, 10, 12, 33];

$countSort = new CountSort($testData);
echo '<pre>';
var_dump($countSort->sort());

输出

<pre>array(11) {
  [0]=>
  int(2)
  [1]=>
  int(3)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(10)
  [5]=>
  int(10)
  [6]=>
  int(12)
  [7]=>
  int(15)
  [8]=>
  int(20)
  [9]=>
  int(30)
  [10]=>
  int(33)
}

到此这篇关于php计数排序算法的实现代码的文章就介绍到这了,更多相关php计数排序内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
用PHP和ACCESS写聊天室(三)
Oct 09 PHP
php中对xml读取的相关函数的介绍一
Jun 05 PHP
PHP基于数组实现的分页函数实例
Aug 20 PHP
php常用表单验证类用法实例
Jun 18 PHP
php通过排列组合实现1到9数字相加都等于20的方法
Aug 03 PHP
CI分页类首页、尾页不显示的解决方法
Mar 28 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
May 26 PHP
PHP获取指定时间段之间的 年,月,天,时,分,秒
Jun 05 PHP
微信自定义菜单的创建/查询/取消php示例代码
Aug 05 PHP
PHP下的浮点运算不准的解决方法
Oct 27 PHP
php实用代码片段整理
Nov 12 PHP
PHP基于socket实现客户端和服务端通讯功能
Jul 13 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
Mar 30 #PHP
TP5框架实现上传多张图片的方法分析
Mar 29 #PHP
thinkphp框架无限级栏目的排序功能实现方法示例
Mar 29 #PHP
php查看一个变量的占用内存的实例代码
Mar 29 #PHP
tp5框架前台无限极导航菜单类实现方法分析
Mar 29 #PHP
PHP中类与对象功能、用法实例解读
Mar 27 #PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 #PHP
You might like
PHP的FTP学习(二)[转自奥索]
2006/10/09 PHP
第十三节--对象串行化
2006/11/16 PHP
批量获取memcache值并按key的顺序返回的实现代码
2011/06/14 PHP
解析php中session的实现原理以及大网站应用应注意的问题
2013/06/17 PHP
教你在PHPStorm中配置Xdebug
2015/07/27 PHP
PHP简单实现断点续传下载的方法
2015/09/25 PHP
PHP微信支付实例解析
2016/07/22 PHP
php基于协程实现异步的方法分析
2019/07/17 PHP
js multiple全选与取消全选实现代码
2012/12/04 Javascript
jquery 快速回到页首的方法
2013/12/05 Javascript
jQuery中验证表单提交方式及序列化表单内容的实现
2014/01/06 Javascript
jquery toolbar与网页浮动工具条具体实现代码
2014/01/12 Javascript
js防止DIV布局滚动时闪动的解决方法
2014/10/30 Javascript
基于javascript实现彩票随机数生成(升级版)
2020/04/17 Javascript
BootStrap和jQuery相结合实现可编辑表格
2016/04/21 Javascript
微信小程序 textarea 组件详解及简单实例
2017/01/10 Javascript
Node.js搭建小程序后台服务
2018/01/03 Javascript
详解vue 数组和对象渲染问题
2018/09/21 Javascript
基于Vue实现图片在指定区域内移动的思路详解
2018/11/11 Javascript
vue之debounce属性被移除及处理详解
2019/11/13 Javascript
js实现时分秒倒计时
2019/12/03 Javascript
Jquery cookie插件实现原理代码解析
2020/08/04 jQuery
python之模拟鼠标键盘动作具体实现
2013/12/30 Python
Python函数可变参数定义及其参数传递方式实例详解
2015/05/25 Python
浅谈django中的认证与登录
2016/10/31 Python
Python函数装饰器实现方法详解
2018/12/22 Python
Python3 chardet模块查看编码格式的例子
2019/08/14 Python
使用虚拟环境打包python为exe 文件的方法
2019/08/29 Python
Django实现简单网页弹出警告代码
2019/11/15 Python
Python os库常用操作代码汇总
2020/11/03 Python
一文带你掌握Pyecharts地理数据可视化的方法
2021/02/06 Python
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
英国浴室洗脸盆购物网站:Click Basin
2018/06/08 全球购物
2015年政风行风工作总结
2015/04/21 职场文书
老公出轨后的保证书
2015/05/08 职场文书
党小组鉴定意见
2015/06/02 职场文书