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 相关文章推荐
Javascript 跨域访问解决方案
Feb 14 Javascript
从零开始学习jQuery (六) jquery中的AJAX使用
Feb 23 Javascript
jquery 清空file域示例(兼容个浏览器)
Oct 11 Javascript
简单的jQuery入门指引
Jul 28 Javascript
js实现点击文本框显示日期选择器特效代码分享
May 21 Javascript
JavaScript 控制字体大小设置的方法
Nov 23 Javascript
jQuery实现立体式数字滚动条增加效果
Dec 21 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
Apr 07 Javascript
bootstrap select插件封装成Vue2.0组件
Apr 17 Javascript
浅谈Vue.nextTick 的实现方法
Oct 25 Javascript
vue 使用外部JS与调用原生API操作示例
Dec 02 Javascript
浅谈在vue-cli3项目中解决动态引入图片img404的问题
Aug 04 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
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
PHP自定义函数收代码
2010/08/01 PHP
php中大括号作用介绍
2012/03/22 PHP
php使用变量动态创建类的对象用法示例
2017/02/06 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
TopList标签和JavaScript结合两例
2007/08/12 Javascript
利用js跨页面保存变量做菜单的方法
2008/01/17 Javascript
JQuery1.6 使用方法三
2011/11/23 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
JavaScript实现从数组中选出和等于固定值的n个数
2014/09/03 Javascript
jquery ui resize 中border-box的bug修正
2015/04/26 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
javascript 注释代码的几种方法总结
2017/01/04 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
2017/03/03 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
2017/05/11 Javascript
探究react-native 源码的图片缓存问题
2017/08/24 Javascript
在vue中解决提示警告 for循环报错的方法
2018/09/28 Javascript
vue+axios实现post文件下载
2019/09/25 Javascript
vue+iview分页组件的封装
2020/11/17 Vue.js
Python中运行并行任务技巧
2015/02/26 Python
python中的错误处理
2016/04/10 Python
Python中的异常处理相关语句基础学习笔记
2016/07/11 Python
在Python 中同一个类两个函数间变量的调用方法
2019/01/31 Python
Python使用pymongo库操作MongoDB数据库的方法实例
2019/02/22 Python
Python GUI学习之登录系统界面篇
2019/08/21 Python
python模块常用用法实例详解
2019/10/17 Python
python字符串拼接+和join的区别详解
2020/12/03 Python
详解CSS3中的box-sizing(content-box与border-box)
2019/04/19 HTML / CSS
英国领先的亚洲旅游专家:Wendy Wu Tours
2018/01/21 全球购物
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
美国厨房和园艺工具网上商店:Nestneed
2019/08/24 全球购物
2014年父亲节活动方案
2014/03/06 职场文书
企业法人授权委托书范本
2014/09/23 职场文书
兵马俑导游词
2015/02/02 职场文书
面试复试通知单
2015/04/24 职场文书
2015年学校远程教育工作总结
2015/07/20 职场文书