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 相关文章推荐
超强的IE背景图片闪烁(抖动)的解决办法
Sep 09 Javascript
JQuery 将元素显示在屏幕的中央的代码
Feb 27 Javascript
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
Aug 28 Javascript
详解JavaScript中void语句的使用
Jun 04 Javascript
angularjs 源码解析之scope
Aug 22 Javascript
jQuery DateTimePicker 日期和时间插件示例
Jan 22 Javascript
React服务端渲染(总结)
Jul 01 Javascript
对vue下点击事件传参和不传参的区别详解
Sep 15 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
Feb 20 Javascript
JavaScript偏函数与柯里化实例详解
Mar 27 Javascript
详解Jest结合Vue-test-utils使用的初步实践
Jun 27 Javascript
js面试题之异步问题的深入理解
Sep 20 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 微信开发获取用户信息如何实现
2016/12/13 PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
2017/05/04 PHP
php PDO属性设置与操作方法分析
2018/12/27 PHP
apycom出品的jQuery精美菜单破解方法
2011/02/18 Javascript
简单时间提示DEMO从0开始一直进行计时
2013/11/19 Javascript
jquery实现点击文字可编辑并修改保存至数据库
2014/04/15 Javascript
JavaScript使用function定义对象并调用的方法
2015/03/23 Javascript
jQuery插件jquery-barcode实现条码打印的方法
2015/11/25 Javascript
JS实现倒计时(天数、时、分、秒)
2016/11/16 Javascript
利用Bootstrap实现表格复选框checkbox全选
2016/12/21 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
2018/01/05 Javascript
微信小程序的开发范式BeautyWe.js入门详解
2019/07/10 Javascript
解决vue页面渲染但dom没渲染的操作
2020/07/27 Javascript
[05:53]完美世界携手游戏风云打造 卡尔工作室观战系统篇
2013/04/22 DOTA
python正则表达式抓取成语网站
2013/11/20 Python
python实现巡检系统(solaris)示例
2014/04/02 Python
Python统计单词出现的次数
2018/04/04 Python
详解PyTorch批训练及优化器比较
2018/04/28 Python
PySide和PyQt加载ui文件的两种方法
2019/02/27 Python
深入浅析Python 中 is 语法带来的误解
2019/05/07 Python
Python pip 安装与使用(安装、更新、删除)
2019/10/06 Python
python numpy中cumsum的用法详解
2019/10/17 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
2020/02/03 Python
澳大利亚女士时装在线:Rockmans
2018/09/26 全球购物
洲际酒店集团英国官网:IHG英国
2019/07/10 全球购物
什么是Connection-oriented Protocol/Connectionless Protocol面向连接的协议/无连接协议
2012/09/06 面试题
什么是Linux虚拟文件系统VFS
2015/08/25 面试题
办公室年终个人自我评价
2013/10/28 职场文书
成功的餐厅经营创业计划书
2014/01/15 职场文书
创业计划书如何编写
2014/02/06 职场文书
临床医学专业求职信
2014/08/08 职场文书
2016年主题党日活动总结
2016/04/05 职场文书
90条交通安全宣传标语
2019/10/12 职场文书
分享几个实用的CSS代码块
2022/06/10 HTML / CSS
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript