JS桶排序的简单理解与实现方法示例


Posted in Javascript onNovember 25, 2019

本文实例讲述了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 ? parseInt(caskCount) : 10;
    //获取数组的最大值和最小值
    for(var i=1;i<len-1;i++){
       max = arr[i] <= max ? max : arr[i] ; 
       min = arr[i] >= min ? min : arr[i] ; 
    }
    //分成caskCount个桶,桶所占用的范围
    var range = (max - min) / caskCount;
    for(var i=0;i<len;i++){
      //桶的数值减去最小数 min 获取的是桶占用的范围,再除以一个桶的范围,就是获取对应的桶编号
      var index = Math.floor((arr[i] - min) / range);
      //桶里是否有值,有值则进行排序
      if(list[index]){//用数组模拟桶
        //获取桶最后一个值的下标 
        var k=list[index].length - 1;
        //桶最后的值大于要插进来的值,所以要把这个值插到桶的前面去,但不知道这个值要插入到前面的哪个位置,所以,就只能对比排序了
          //对桶进行排序
          while(k >=0 && list[index][k] > arr[i]){
            //桶前面的数字放到后面去
            list[index][k+1] = list[index][k];//第一个k+1为新增的桶
            //小的提前一个位置
            //list[index][k] = arr[i];
            k--;
          }
        //不用排序的,直接加在桶的最后面
        list[index][k+1] = arr[i];
      }else{
      //没有值则生成桶,并把值放到对应的桶中
        list[index]=[];
        list[index][0]=arr[i];
      }
    }
    //合并桶
    var n=0;
    while(n <= caskCount){
      if(list[n]){
        result = result.concat(list[n]);
      }
      n++;
    }
    return result;
  }
  var arr=[8,39,400,500,3,4,20,44,440];
  alert(cask(arr,10));
  //alert(parseInt(-1) ? parseInt(-1) : 1);
  </script>
</head>
<body>
</body>
</html>

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

Javascript 相关文章推荐
Riot.js 快速的JavaScript单元测试框架
Nov 09 Javascript
JS异常处理的一个想法(sofish)
Mar 14 Javascript
jQuery+css实现图片滚动效果(附源码)
Mar 18 Javascript
jQuery .attr()和.removeAttr()方法操作元素属性示例
Jul 16 Javascript
js几秒以后倒计时跳转示例
Dec 26 Javascript
js的延迟执行问题分析
Jun 23 Javascript
给js文件传参数(详解)
Jul 13 Javascript
JavaScript中诡异的delete操作符
Mar 12 Javascript
JS控制表单提交的方法
Jul 09 Javascript
window.close(); 关闭浏览器窗口js代码的总结介绍
Jul 14 Javascript
node.js调用Chrome浏览器打开链接地址的方法
May 17 Javascript
详解基于webpack2.x的vue2.x的多页面站点
Aug 21 Javascript
JavaScript交换两个变量方法实例
Nov 25 #Javascript
three.js利用gpu选取物体并计算交点位置的方法示例
Nov 25 #Javascript
基于javascript实现贪吃蛇小游戏
Nov 25 #Javascript
JavaScript This指向问题详解
Nov 25 #Javascript
简单了解JavaScript sort方法
Nov 25 #Javascript
vue使用swiper实现中间大两边小的轮播图效果
Nov 24 #Javascript
通过GASP让vue实现动态效果实例代码详解
Nov 24 #Javascript
You might like
日本收入最高的漫画家:海贼王作者版税年收入高达8.45亿元
2020/03/04 日漫
一条久听不愿放下的DIY森海MX500,三言两语话神奇
2021/03/02 无线电
php 文件上传系统手记
2009/10/26 PHP
php 连接mysql连接被重置的解决方法
2011/02/15 PHP
PHP求小于1000的所有水仙花数的代码
2012/01/10 PHP
PHP生成json和xml类型接口数据格式
2015/05/17 PHP
PHP基于XMLWriter操作xml的方法分析
2017/07/17 PHP
javascript动态加载二
2012/08/22 Javascript
JS实现的用来对比两个用指定分隔符分割的字符串是否相同
2014/09/19 Javascript
JS中字符串trim()使用示例
2015/05/26 Javascript
七夕情人节丘比特射箭小游戏
2015/08/20 Javascript
js中flexible.js实现淘宝弹性布局方案
2020/06/23 Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
2016/05/28 Javascript
AngularJS基础 ng-paste 指令简单示例
2016/08/02 Javascript
jQuery实现的简单拖拽功能示例
2016/09/13 Javascript
基于JavaScript实现百度搜索框效果
2020/06/28 Javascript
vue.js 实现图片本地预览 裁剪 压缩 上传功能
2018/03/01 Javascript
vue中的router-view组件的使用教程
2018/10/23 Javascript
iview实现动态表单和自定义验证时间段重叠
2021/01/10 Javascript
在python的类中动态添加属性与生成对象
2016/09/17 Python
python中requests使用代理proxies方法介绍
2017/10/25 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
2018/04/23 Python
python环形单链表的约瑟夫问题详解
2018/09/27 Python
对python的输出和输出格式详解
2018/12/08 Python
jupyter note 实现将数据保存为word
2020/04/14 Python
python中def是做什么的
2020/06/10 Python
Python logging自定义字段输出及打印颜色
2020/11/30 Python
python 实现全球IP归属地查询工具
2020/12/18 Python
利用CSS3的transition属性实现滑动效果
2015/08/05 HTML / CSS
HTML5语音识别标签写法附图
2013/11/18 HTML / CSS
美国排名第一的泳池用品直接来源:In The Swim
2019/09/23 全球购物
简历中自我评价范文
2015/03/11 职场文书
2015年监理工作总结范文
2015/04/07 职场文书
格列夫游记读书笔记
2015/07/01 职场文书
安全教育培训心得体会
2016/01/15 职场文书
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby