本文实例讲述了JS桶排序的简单理解与实现方法。分享给大家供大家参考,具体如下:
桶排序,利用编号分组存储数字,再利用编号合并分组的一种算法排序。
举个易于理解的例子:
一组数字,9,3,4,0,2,8,5,1,7,6,11,10,18,15,17,12,16,13,19,14
我们把这组数字分组编号成10个桶装起来,但怎么编号分组呢?
这里我们利用数字范围来对数字进行分桶。首先,最大数减去最小数,获取这组数字的取值范围,然后,我们让这个取值范围除以桶数,获取一个桶的取值范围,既然知道一个桶的取值范围,那么,通过对比每个数字占用多少个桶,我们就可以获取这个数字所对应的桶的编号了。(换一句话说,就是每个数字占用多少个取值范围,这里的桶其实就是数字的取值范围的具体化东西)
利用上面的例子做解释:
上面的最大值是19,最小值是0,所以这组数的取值范围是:19-0=19。
我们要用10个桶来分装这组数字,则一个桶的取值范围是:19 / 10 = 1.9。
所以,一个桶的取值范围就是:1.9。
知道了这些之后,我们怎么知道每个数字所对应的桶的编号呢?
我们让每个数字减去最小值再除以一个桶的取值范围就可以获得这个数字所对应的桶编号了,为什么这么说呢?因为我们就是利用数值范围来分桶的,所以理所当然的也是获取每个数字的取值范围来分桶的编号,而最小值就是我们的取值标准,当然是要每个数字都减去它才能准确的获取每个数的取值范围了。
根据上面的解释,那么,第一个数字的桶编号就是:(9-0) / 1.9 = 4.7368·······
当然为了确保编号为整数,我们必须给编号取整,这里我们是向上取整,所以第一个数:9的桶编号就是5啦。
其他的数字获取桶编号都是同样的原理,这里就不再重复叙述了。
下面是js程序的实现:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-cn"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <title>桶排序</title> <meta name="keywords" content="关键字列表" /> <meta name="description" content="网页描述" /> <link rel="stylesheet" type="text/css" href="" /> <style type="text/css"></style> <script type="text/javascript"> //桶排序,参数数组,桶的个数,这里用数组模拟桶 var cask=function (arr,caskCount){ //不是数组,返回false if(toString.call(arr) != '[object Array]'){ return false; } //获取数组的长度 var len = arr.length; if(len <=1){ return arr;//长度小于等于1不用排序 } var list = [],//装桶的桶,用它来控制存储桶的编号 result = [],//返回的结果 max = arr[0], min = arr[0]; //默认桶的个数为10 var caskCount = parseInt(caskCount) > 0 "color: #ff6600">在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。PS:这里再为大家推荐一款关于排序的演示工具供大家参考:
在线动画演示插入/选择/冒泡/归并/希尔/快速排序算法过程工具:
http://tools.jb51.net/aideddesign/paixu_ys更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数学运算用法总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript数组操作技巧总结》、《JavaScript排序算法总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结》
希望本文所述对大家JavaScript程序设计有所帮助。
JS,桶排序
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com