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 相关文章推荐
js href的用法
May 13 Javascript
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
Dec 28 Javascript
jQuery1.3.2 升级到jQuery1.4.4需要修改的地方
Jan 06 Javascript
jquery ajax 调用失败的原因示例介绍
Sep 27 Javascript
一个css与js结合的下拉菜单支持主流浏览器
Oct 08 Javascript
Bootstrap入门书籍之(四)菜单、按钮及导航
Feb 17 Javascript
Backbone View 之间通信的三种方式
Aug 09 Javascript
jQuery中 bind的用法简单介绍
Feb 13 Javascript
JS实现的Unicode编码转换操作示例
Apr 28 Javascript
简单实现节流函数和防抖函数过程解析
Oct 08 Javascript
vue请求数据的三种方式
Mar 04 Javascript
如何在微信小程序中使用骨架屏的步骤
Jun 12 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实现用户在线时间统计详解
2011/10/08 PHP
php while循环得到循环次数
2013/10/26 PHP
php中__destruct与register_shutdown_function执行的先后顺序问题
2014/10/17 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
2016/05/11 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
深入解析PHP底层机制及相关原理
2020/12/11 PHP
document对象execCommand的command参数介绍
2006/08/01 Javascript
javascript上传图片前预览图片兼容大多数浏览器
2013/10/25 Javascript
七夕情人节丘比特射箭小游戏
2015/08/20 Javascript
Eclipse引入jquery报错如何解决
2015/12/01 Javascript
js实现倒计时及时间对象
2016/11/15 Javascript
Vue Spa切换页面时更改标题的实例代码
2017/07/15 Javascript
深入理解ES6的迭代器与生成器
2017/08/19 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
2018/01/03 Javascript
vue组件中的数据传递方法
2018/05/14 Javascript
浅谈redux, koa, express 中间件实现对比解析
2019/05/23 Javascript
Vue.js数字输入框组件使用方法详解
2019/10/19 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
2020/07/19 Javascript
node.js 如何监视文件变化
2020/09/01 Javascript
[55:45]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.24
2019/09/10 DOTA
使用Python的turtle模块画图的方法
2017/11/15 Python
3分钟学会一个Python小技巧
2018/11/23 Python
PyQt5中多线程模块QThread使用方法的实现
2020/01/31 Python
自定义Django默认的sitemap站点地图样式
2020/03/04 Python
django处理select下拉表单实例(从model到前端到post到form)
2020/03/13 Python
Python openpyxl模块实现excel读写操作
2020/06/30 Python
python自动生成证件号的方法示例
2021/01/14 Python
基督教卡片、励志礼品、家居装饰等:DaySpring
2018/10/12 全球购物
FC-Moto瑞典:欧洲最大的摩托车服装和头盔商店之一
2018/11/27 全球购物
留学推荐信怎么写
2014/01/25 职场文书
甜品蛋糕店创业计划书
2014/09/21 职场文书
总经理检讨书范文
2015/02/16 职场文书
《黄道婆》教学反思
2016/02/22 职场文书
高端收音机+蓝牙音箱,JBL TUNER FM带收音蓝牙音箱评测
2021/04/24 无线电
python获取带有返回值的多线程
2022/05/02 Python