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 相关文章推荐
关于hashchangebroker和statehashable的补充文档
Aug 08 Javascript
javascript里使用php代码实例
Dec 13 Javascript
7个jQuery最佳实践
Jan 12 Javascript
JavaScript制作简单的日历效果
Mar 10 Javascript
bootstrap table小案例
Oct 21 Javascript
Bootstrap简单表单显示学习笔记
Nov 15 Javascript
jQuery实现两个select控件的互移操作
Dec 22 Javascript
微信小程序 循环及嵌套循环的使用总结
Sep 26 Javascript
Vue-router的使用和出现空白页,路由对象属性详解
Sep 03 Javascript
Vue.js@2.6.10更新内置错误处机制Fundebug同步支持相应错误监控
May 13 Javascript
three.js 利用uv和ThreeBSP制作一个快递柜功能
Aug 18 Javascript
vue实现列表垂直无缝滚动
Apr 08 Vue.js
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
香妃
2021/03/03 冲泡冲煮
PHP生成月历代码
2007/06/14 PHP
dedecms函数分享之获取某一栏目所有子栏目
2014/05/19 PHP
PHP中strpos、strstr和stripos、stristr函数分析
2016/06/11 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
2019/01/15 PHP
JQuery index()方法使用代码
2010/06/02 Javascript
让innerText在firefox火狐和IE浏览器都能用的写法
2011/05/14 Javascript
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
2011/08/28 Javascript
20行代码实现的一个CSS覆盖率测试脚本
2013/07/07 Javascript
input禁止键盘及中文输入,但可以点击
2014/02/13 Javascript
跟我学习javascript创建对象(类)的8种方法
2015/11/20 Javascript
JS检测移动端横竖屏的代码
2016/05/30 Javascript
Angular.js实现动态加载组件详解
2017/05/28 Javascript
关于vue-router的beforeEach无限循环的问题解决
2017/09/09 Javascript
ionic3+Angular4实现接口请求及本地json文件读取示例
2017/10/11 Javascript
js导出Excel表格超出26位英文字符的解决方法ES6
2017/11/15 Javascript
js实现简单的倒计时
2021/01/28 Javascript
python实现探测socket和web服务示例
2014/03/28 Python
python检测某个变量是否有定义的方法
2015/05/20 Python
Atom的python插件和常用插件说明
2018/07/08 Python
详解python中的线程与线程池
2019/05/10 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
详解python实现数据归一化处理的方式:(0,1)标准化
2019/07/17 Python
python反转列表的三种方式解析
2019/11/08 Python
解决TensorFlow模型恢复报错的问题
2020/02/06 Python
python异步Web框架sanic的实现
2020/04/27 Python
Python3自动生成MySQL数据字典的markdown文本的实现
2020/05/07 Python
python使用hdfs3模块对hdfs进行操作详解
2020/06/06 Python
关于python中remove的一些坑小结
2021/01/04 Python
PyQt5中QSpinBox计数器的实现
2021/01/18 Python
CSS3中Animation动画属性用法详解
2016/07/04 HTML / CSS
html5调用摄像头功能的实现代码
2018/05/07 HTML / CSS
几个解决兼容IE6\7\8不支持html5标签的几个方法
2013/01/07 HTML / CSS
超市开业庆典活动策划方案
2014/09/15 职场文书
MySQL如何使用使用Xtrabackup进行备份和恢复
2021/06/21 MySQL
opencv用VS2013调试时用Image Watch插件查看图片
2021/07/26 Python