JS实现的计数排序与基数排序算法示例


Posted in Javascript onDecember 04, 2017

本文实例讲述了JS实现的计数排序与基数排序算法。分享给大家供大家参考,具体如下:

计数排序

计数排序就是简单的桶排序,一个桶代表数组中一个数出现的个数,所以需要一个和数组数字范围一样大的辅助数组,一般用在范围小于100的排序,时间复杂度为O(n),空间复杂度为数组的数字范围。

/**
 * 范围在 start - end 之间的排序
 * 计数排序需要辅助数组,该辅助数组的长度是待排序数组的范围,所以一般用作范围小于100的排序
 */
function countSort(arr, start, end) {
  var len = arr.length;
  // 桶数组
  var suportArr = new Array(end - start + 1);
  // 结果数组
  var resArr = new Array(len);
  // 初始化桶数组
  for (i = 0; i < suportArr.length; i++) {
    suportArr[i] = 0;
  }
  // 待排序数组中的数组出现,在桶子对应位置+1代表这个数出现的个数+1了
  for (let i = 0; i < len; i++) {
    suportArr[arr[i]]++;
  }
   // 从第1项开始,桶数组加上前一个桶的个数,现在辅助数组的意义变成了每一项的排名了。
  for (let i = 1; i < suportArr.length; i++) {
    suportArr[i] += suportArr[i - 1];
  }
  // 根据辅助数组的排名,从后往前赋值
  for (let i = len - 1; i >= 0; i--) {
    resArr[suportArr[arr[i]] - 1] = arr[i];
    suportArr[arr[i]]--;
  }
  return resArr;
}

基数排序

基数排序是多躺的桶排序

var radix = 16; // 基数,可以为任何数,越大趟数越小,但是桶数越多,最好根据最大数字进行定义。
function _roundSort(arr, round, radix) {
  var buckets = new Array(radix);
  for (let i = 0; i < radix; i++) {
    buckets[i] = [];
  }
  // 将数组中的数放进对应的桶子中
  for (let i = 0; i < arr.length; i++) {
    let remainder = Math.floor(arr[i] / (radix ** (round - 1))) % radix;
    buckets[remainder].push(arr[i]);
  }
  // 将数组重新根据桶子进行排序
  var index = 0;
  for (let i = 0; i < buckets.length; i++) {
    for (let j = 0; j < buckets[i].length; j++) {
      arr[index++] = buckets[i][j];
    }
  }
}
function radixSort(arr, round) {
  for (let i = 1; i <= round; i++) {
    _roundSort(arr, i, radix);
  }
  return arr;
}
console.log(radixSort([10,5,5,50,0,155,4622,5,1,4,2154], 4));
Javascript 相关文章推荐
对采用动态原型方式无法展示继承机制得思考
Dec 04 Javascript
JQuery模板插件 jquery.tmpl 动态ajax扩展
Nov 10 Javascript
js判断元素是否隐藏的方法
Jun 09 Javascript
jquery使用$(element).is()来判断获取的tagName
Aug 24 Javascript
创建、调用JavaScript对象的方法集锦
Dec 24 Javascript
jQuery实用技巧必备(中)
Nov 03 Javascript
AngularJS实现DOM元素的显示与隐藏功能
Nov 22 Javascript
微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解
Dec 08 Javascript
node.js实现的装饰者模式示例
Sep 06 Javascript
分析JS单线程异步io回调的特性
Dec 01 Javascript
javascript实现贪吃蛇经典游戏
Apr 10 Javascript
VUE Elemen-ui之穿梭框使用方法详解
Jan 19 Javascript
JS 中document.write()的用法和清空的原因浅析
Dec 04 #Javascript
JavaScript实现省市联动过程中bug的解决方法
Dec 04 #Javascript
浅谈 vue 中的 watcher
Dec 04 #Javascript
vue中的计算属性的使用和vue实例的方法示例
Dec 04 #Javascript
Vue导出json数据到Excel电子表格的示例
Dec 04 #Javascript
微信小程序tabBar用法实例详解
Dec 04 #Javascript
详解如何实现一个简单的Node.js脚手架
Dec 04 #Javascript
You might like
关于php fread()使用技巧
2010/01/22 PHP
一个PHP分页类的代码
2011/05/18 PHP
关于PHP堆栈与列队的学习
2013/06/21 PHP
php读取富文本的时p标签会出现红线是怎么回事
2014/05/13 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
JQuery实现超链接鼠标提示效果的方法
2015/06/10 Javascript
js绘制圆形和矩形的方法
2015/08/05 Javascript
jQuery实现HTML表格单元格的合并功能
2016/04/06 Javascript
JavaScript必知必会(十) call apply bind的用法说明
2016/06/08 Javascript
JS事件添加和移出的兼容写法示例
2016/06/20 Javascript
javascript 利用arguments实现可变长参数
2016/11/21 Javascript
JavaScript获取服务器时间的方法详解
2016/12/11 Javascript
javascript实现table单元格点击展开隐藏效果(实例代码)
2017/04/10 Javascript
webpack之引入图片的实现及问题
2018/10/08 Javascript
vue实现二级导航栏效果
2019/10/19 Javascript
在vue中把含有html标签转为html渲染页面的实例
2019/10/28 Javascript
vue进入页面时不在顶部,检测滚动返回顶部按钮问题及解决方法
2019/10/30 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
[48:26]VGJ.S vs infamous Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
采用Psyco实现python执行速度提高到与编译语言一样的水平
2014/10/11 Python
用Python的Django框架编写从Google Adsense中获得报表的应用
2015/04/17 Python
在Python的Django框架下使用django-tagging的教程
2015/05/30 Python
Linux下为不同版本python安装第三方库
2016/08/31 Python
利用python打印出菱形、三角形以及矩形的方法实例
2017/08/08 Python
python实现二分查找算法
2017/09/21 Python
快速解决安装python没有scripts文件夹的问题
2018/04/03 Python
tensorflow实现在函数中用tf.Print输出中间值
2020/01/21 Python
html5+CSS3+JS实现七夕言情功能代码
2017/08/28 HTML / CSS
Dr.Jart+美国官网:韩国药妆品牌
2019/01/18 全球购物
女大学生毕业找工作的自我评价
2013/10/03 职场文书
房屋继承公证书
2014/04/10 职场文书
学校班子个人对照检查材料思想汇报
2014/09/27 职场文书
大班上学期个人总结
2015/02/13 职场文书
python开发实时可视化仪表盘的示例
2021/05/07 Python
golang 语言中错误处理机制
2021/08/30 Golang
MySQL一劳永逸永久支持输入中文的方法实例
2022/08/05 MySQL