本文实例讲述了PHP排序算法之基数排序(Radix Sort)。分享给大家供大家参考,具体如下:

基数排序在《大话数据结构》中并未讲到,但是为了凑齐八大排序算法,我自己通过网络学习了这个排序算法,并给大家分享出来。

基本思想:

基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。

其实这个思想我也没法总结出来,下面通过例子来说明吧:

基本解法:

PS:在这里我们介绍的基数排序我们采用 LSD(最低位优先),当然还有 MSD(最高位优先),大家自己去百度一下他们之间的异同吧。

假如现在我们有以下这么一些数:

2 343 342 1 128 43 4249 814 687 654 3

我们使用基数排序将他们从小到大排序。

第一步、首先根据个位数的数值,在走访数值(从前到后走访,后面步骤相同)时将它们分配至编号0到9的桶子中:

0 :

1 : 1

2 : 2 342

3 : 343 43 3

4 : 814 654

5 :

6 :

7 : 687

8 : 128

9 : 4249

第二步、接下来将这些桶子中的数值重新串接起来,成为以下的数列:

1 2 342 343 43 3 814 654 687 128 4249

第三步、根据十位数的数值,在走访数值(从前到后走访,后面步骤相同)时将它们分配至编号0到9的桶子中:

0 : 1 2 3

1 : 814

2 : 128

3 :

4 : 342 343 43 4249

5 : 654

6 :

7 :

8 : 687

9 :

第四步、接下来将这些桶子中的数值重新串接起来,成为以下的数列:

1 2 3 814 128 342 343 43 4249 654 687

第五步、根据百位数的数值,在走访数值(从前到后走访,后面步骤相同)时将它们分配至编号0到9的桶子中:

0 : 1 2 3 43

1 : 128

2 : 4249

3 : 342 343

4 :

5 :

6 : 654 687

7 :

8 : 814

9 :

第六步、接下来将这些桶子中的数值重新串接起来,成为以下的数列:

1 2 3 43 128 4249 342 343 654 687 814

。。。。。。后面的步骤大家应该都会走了吧。其实到了第六步的时候就剩 4249 没有排好序了。

从上面的步骤来看,很多的步骤都是相同的,因此肯定是个循环了,我们只需要控制个位、十位、百位、、、、就好了。

还是看代码吧。

算法实现:

//交换函数

function swap(array &$arr,$a,$b){

$temp = $arr[$a];

$arr[$a] = $arr[$b];

$arr[$b] = $temp;

}

//获取数组中的最大数

//就像上面的例子一样,我们最终是否停止算法不过就是看数组中的最大值:4249,它的位数就是循环的次数

function getMax(array $arr){

$max = 0;

$length = count($arr);

for($i = 0;$i < $length;$i ++){

if($max < $arr[$i]){

$max = $arr[$i];

}

}

return $max;

}

//获取最大数的位数,最大值的位数就是我们分配桶的次数

function getLoopTimes($maxNum){

$count = 1;

$temp = floor($maxNum / 10);

while($temp != 0){

$count ++;

$temp = floor($temp / 10);

}

return $count;

}

/**

* @param array $arr 待排序数组

* @param $loop 第几次循环标识

* 该函数只是完成某一位(个位或十位)上的桶排序

*/

function R_Sort(array &$arr,$loop){

//桶数组,在强类型语言中,这个数组应该声明为[10][count($arr)]

//第一维是 0-9 十个数

//第二维这样定义是因为有可能待排序的数组中的所有数的某一位上的只是一样的,这样就全挤在一个桶里面了

$tempArr = array();

$count = count($arr);

//初始化$tempArr数组

for($i = 0;$i < 10;$i ++){

$tempArr[$i] = array();

}

//求桶的index的除数

//如798个位桶index=(798/1)%10=8

//十位桶index=(798/10)%10=9

//百位桶index=(798/100)%10=7

//$tempNum为上式中的1、10、100

$tempNum = (int)pow(10, $loop - 1);

for($i = 0;$i < $count;$i ++){

//求出某位上的数字

$row_index = ($arr[$i] / $tempNum) % 10;

for($j = 0;$j < $count;$j ++){

if(@$tempArr[$row_index][$j] == NULL){

$tempArr[$row_index][$j] = $arr[$i]; //入桶

break;

}

}

}

//还原回原数组中

$k = 0;

for($i = 0;$i < 10;$i ++){

for($j = 0;$j < $count;$j ++){

if(@$tempArr[$i][$j] != NULL){

$arr[$k ++] = $tempArr[$i][$j]; //出桶

$tempArr[$i][$j] = NULL; //避免下次循环的时候污染数据

}

}

}

}

//最终调用的主函数

function RadixSort(array &$arr){

$max = getMax($arr);

$loop = getLoopTimes($max);

//对每一位进行桶分配(1 表示个位,$loop 表示最高位)

for($i = 1;$i <= $loop;$i ++){

R_Sort($arr,$i);

}

}

调用算法:

$arr = array(2, 343, 342, 1, 128, 43, 4249, 814, 687, 654, 3);

RadixSort($arr);

var_dump($arr);

运行结果:

array(11) {

[0]=>

int(1)

[1]=>

int(2)

[2]=>

int(3)

[3]=>

int(43)

[4]=>

int(128)

[5]=>

int(342)

[6]=>

int(343)

[7]=>

int(654)

[8]=>

int(687)

[9]=>

int(814)

[10]=>

int(4249)

}

其实这些代码我是在挺早之前写的,今天在写博客的时候发现,其实桶就是一个队列,所以上面的 R_Sort()函数复杂了,我们使用 array_push()和 array_shift()来重写该方法(当然,要模拟队列的话,用 SPL 提供的 splqueue是最为恰当的,在这里为了简便我就不用了):

function R_Sort(array &$arr,$loop){

$tempArr = array();

$count = count($arr);

for($i = 0;$i < 10;$i ++){

$tempArr[$i] = array();

}

//求桶的index的除数

//如798个位桶index=(798/1)%10=8

//十位桶index=(798/10)%10=9

//百位桶index=(798/100)%10=7

//$tempNum为上式中的1、10、100

$tempNum = (int)pow(10, $loop - 1);

for($i = 0;$i < $count;$i ++){

//求出某位上的数字

$row_index = ($arr[$i] / $tempNum) % 10;

//入桶

array_push($tempArr[$row_index],$arr[$i]);

}

//还原回原数组中

$k = 0;

for($i = 0;$i < 10;$i ++){

//出桶

while(count($tempArr[$i]) > 0){

$arr[$k ++] = array_shift($tempArr[$i]);

}

}

}

基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数。

好了,到这里基数排序就已经给大家介绍完了。这个算法的总结主要是通过看网上的资料,所以就不再给出原作者了。

PS:这里再为大家推荐一款关于排序的演示工具供大家参考:

在线动画演示插入/选择/冒泡/归并/希尔/快速排序算法过程工具:http://tools.jb51.net/aideddesign/paixu_ys

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php排序算法总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《php字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP常用遍历算法与技巧总结》及《PHP数学运算技巧总结》

希望本文所述对大家PHP程序设计有所帮助。

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

php排序算法算法,PHP排序算法之基数排序(Radix Sort)实例详解相关推荐

  1. php实现无限极分类算法,PHP无限极分类函数的实现方法实例详解

    这篇文章主要介绍了PHP无限极分类函数的实现方法,结合实例形式详细分析了php实现无限极分类的具体思路.实现代码与相关注意事项,需要的朋友可以参考下 本文实例讲述了PHP无限极分类函数的实现方法.分享 ...

  2. JAVA中希尔排序去的讲解_java 中基本算法之希尔排序的实例详解

    java 中基本算法之希尔排序的实例详解 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shel ...

  3. html5走格子游戏,JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解

    JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解 发布时间:2020-09-26 20:42:24 来源:脚本之家 阅读:112 作者:krapnik 本文实例讲述了JS/HTML5游戏常 ...

  4. 冒泡排序算法实例详解

    冒泡排序算法实例详解 1.复杂度与稳定性 算法时间复杂度 最坏情况:O(n^2) 最好情况:O(n) 平均情况:O(n^2) 空间复杂度:S(n)=O(1) 稳定性:稳定排序 2.过程介绍(以顺序为例 ...

  5. java二分查找法_java算法之二分查找法的实例详解

    java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...

  6. python如何调用文件进行换位加密_python 换位密码算法的实例详解

    python 换位密码算法的实例详解 一前言: 换位密码基本原理:先把明文按照固定长度进行分组,然后对每一组的字符进行换位操作,从而实现加密.例如,字符串"Error should neve ...

  7. C语言实现基数排序Radix sort算法之二(附完整源码)

    基数排序Radix sort算法 基数排序Radix sort算法的完整源码(定义,实现,main函数测试) 基数排序Radix sort算法的完整源码(定义,实现,main函数测试) #includ ...

  8. C语言实现基数排序Radix sort算法之一(附完整源码)

    基数排序Radix sort算法 基数排序Radix sort算法的完整源码(定义,实现,main函数测试) 基数排序Radix sort算法的完整源码(定义,实现,main函数测试) #includ ...

  9. 实例详解 DB2 排序监控和调优

    实例详解 DB2 排序监控和调优 http://automationqa.com/forum.php?mod=viewthread&tid=2882&fromuid=2

最新文章

  1. vue - config(index.js)
  2. C#中在定义事件委托时怎样跨窗体传递参数
  3. Flex 布局教程:语法
  4. 从一个简单的Java单例示例谈谈并发
  5. 阿里 DataX 增量同步 介绍与使用
  6. java list 在头部添加6_【Java提高十六】集合List接口详解
  7. 2.企业安全建设入门(基于开源软件打造企业网络安全) --- 业务网纵深防御体系建设
  8. 方舟原始恐惧mod生物代码_方舟:生存进化新手攻略
  9. 软件工程导论知识点总结
  10. 海风教育荣获“中国(行业)典范品牌”
  11. 关于三极管集电极电压1V以上后伏安特性曲线不右移
  12. Java经典for循环题目:兔子繁殖问题
  13. Mysql查询各科成绩前三名并分别排序
  14. 带财神和白搭胡牌算法
  15. android生成图片不失真,Android的PdfRenderer类生成低质量图像
  16. 一个Android开发者眼中的微信小程序
  17. php aes解密中文,PHP AES加密解密算法
  18. php购物车面试题,PHP 购物车 session(非框架)
  19. ARCGIS进行地理配准及影像配准并加载到谷歌地球中查看矢量地图SHP
  20. F8观后感:Facebook不止眼前的繁荣,还有雄心和远方

热门文章

  1. 用户操作计算机的方法,操作者向计算机输入信息最常用的方法是(B).doc
  2. java集合转labelpoint_java – 向Spark ML LabeldPoint添加自定义字段
  3. 大学计算机思维导图_【21计算机考研】改考408+1!上海电力大学翻倍扩招,仍考数据结构!...
  4. java如何用反射把具体方法抽象_如何在Java 中使用泛型或反射机制对DAO进行抽象...
  5. 中南大学计算机网.doc,中南大学计算机网络习题2014-2.doc
  6. 运行c_const 并不能加快 C 代码的运行速度?
  7. python 字符串转换
  8. 图解TCPIP-IP 网际协议-路由控制
  9. opencv-api convexityDefects
  10. echarts box