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实现的真正的iframe高度自适应(兼容IE,FF,Opera)
Mar 07 Javascript
页面只有一个text的时候,回车自动submit的解决方法
Aug 12 Javascript
js移除事件 js绑定事件实例应用
Nov 28 Javascript
利用Keydown事件阻止用户输入实现代码
Mar 11 Javascript
asp.net中oracle 存储过程(图文)
Aug 12 Javascript
基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
May 12 Javascript
JavaScript简单计算人的年龄示例
Apr 15 Javascript
微信小程序新增的拖动组件movable-view使用教程
May 20 Javascript
vue微信分享的实现(在当前页面分享其他页面)
Apr 16 Javascript
基于Fixed定位的框选功能的实现代码
May 13 Javascript
微信小程序保持session会话的方法
Mar 20 Javascript
webpack 如何同时输出压缩和未压缩的文件的实现步骤
Jun 05 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生成静态HTML文档的原理
2012/10/29 PHP
PHP循环结构实例讲解
2014/02/10 PHP
php之curl设置超时实例
2014/11/03 PHP
Symfony2框架学习笔记之表单用法详解
2016/03/18 PHP
解决jquery1.9不支持browser对象的问题
2013/11/13 Javascript
js清除input中type等于file的值域(示例代码)
2013/12/24 Javascript
用原生JS实现简单的多选框功能
2017/06/12 Javascript
Mongoose实现虚拟字段查询的方法详解
2017/08/15 Javascript
vue实现商城上货组件简易版
2017/11/27 Javascript
vue实现拖拽进度条
2021/03/01 Vue.js
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
Python json模块使用实例
2015/04/11 Python
python通过百度地图API获取某地址的经纬度详解
2018/01/28 Python
使用python和pygame绘制繁花曲线的方法
2018/02/24 Python
python随机数分布random均匀分布实例
2019/11/27 Python
Python参数传递实现过程及原理详解
2020/05/14 Python
基于selenium及python实现下拉选项定位select
2020/07/22 Python
利用Python将多张图片合成视频的实现
2020/11/23 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
2021/03/03 Python
全面总结使用CSS实现水平垂直居中效果的方法
2016/03/10 HTML / CSS
浅谈Html5移动端ios/Android兼容性总结
2018/06/01 HTML / CSS
Bally美国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/18 全球购物
Bloomingdale’s阿联酋:选购奢华时尚、美容及更多
2020/09/22 全球购物
教师师德教育的自我评价
2013/10/31 职场文书
学生党支部先进事迹
2014/02/04 职场文书
个人现实表现材料
2014/02/04 职场文书
英语演讲稿3分钟
2014/04/29 职场文书
会计专业应届生自荐信
2014/06/28 职场文书
公共机构节能宣传周活动总结
2014/07/09 职场文书
行政执法队伍作风整顿剖析材料
2014/10/11 职场文书
自查自纠整改报告
2014/11/06 职场文书
村干部任职承诺书
2015/01/21 职场文书
利用python做表格数据处理
2021/04/13 Python
Vue中foreach数组与js中遍历数组的写法说明
2021/06/05 Vue.js
基于Python编写简易版的天天跑酷游戏的示例代码
2022/03/23 Python
Python+Pillow+Pytesseract实现验证码识别
2022/05/11 Python