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 快捷键设置实现代码
Mar 13 Javascript
基于JQuery实现的类似购物商城的购物车
Dec 06 Javascript
js实现数组去重、判断数组以及对象中的内容是否相同
Nov 29 Javascript
一个Action如何调用两个不同的方法
May 22 Javascript
你不知道的高性能JAVASCRIPT
Jan 18 Javascript
jQuery Validate插件实现表单验证
Aug 19 Javascript
JQuery学习总结【二】
Dec 01 Javascript
使用JS和canvas实现gif动图的停止和播放代码
Sep 01 Javascript
vue中当图片地址无效的时候,显示默认图片的方法
Sep 18 Javascript
JavaScript实现页面中录音功能的方法
Jun 04 Javascript
vue实现匀速轮播效果
Jun 29 Javascript
JavaScript中关于预编译、作用域链和闭包的理解
Mar 31 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
echo, print, printf 和 sprintf 区别
2006/12/06 PHP
晋城吧对DiscuzX进行的前端优化要点
2010/09/05 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
linux系统下php安装mbstring扩展的二种方法
2014/01/20 PHP
PHP开源开发框架ZendFramework使用中常见问题说明及解决方案
2014/06/12 PHP
PHP多个文件上传到服务器实例
2014/10/29 PHP
JavaScript 反科里化 this [译]
2012/09/20 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
js正文内容高亮效果的实现方法
2013/06/30 Javascript
javascript实现base64 md5 sha1 密码加密
2015/09/09 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
2015/10/26 Javascript
JS组件Bootstrap实现弹出框和提示框效果代码
2015/12/08 Javascript
Jquery实现纵向横向菜单
2016/01/24 Javascript
轻松掌握JavaScript装饰者模式
2016/08/27 Javascript
KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法
2016/10/05 Javascript
jQuery中的一些小技巧
2017/01/18 Javascript
Scala解析Json字符串的实例详解
2017/10/11 Javascript
在NodeJs中使用node-schedule增加定时器任务的方法
2020/06/08 NodeJs
解决vue做详情页跳转的时候使用created方法 数据不会更新问题
2020/07/24 Javascript
[54:53]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第二场
2014/05/23 DOTA
python写入数据到csv或xlsx文件的3种方法
2019/08/23 Python
Rodd & Gunn澳大利亚官网:新西兰男装品牌
2018/09/25 全球购物
OSPREY LONDON官网:英国本土皮具品牌
2019/05/31 全球购物
德国家具、照明、家居用品网上商店:Wayfair.de
2020/02/13 全球购物
高中毕业自我鉴定
2013/12/16 职场文书
中华美德颂演讲稿
2014/05/20 职场文书
旅游文化节策划方案
2014/06/06 职场文书
倡议书的写法
2014/08/30 职场文书
法定代表人资格证明书
2014/09/11 职场文书
2014物价局群众路线对照检查材料思想汇报
2014/09/21 职场文书
2019银行员工个人工作自我鉴定
2019/06/27 职场文书
MySQL主从搭建(多主一从)的实现思路与步骤
2021/05/13 MySQL
Python中zipfile压缩包模块的使用
2021/05/14 Python
SpringBoot读取Resource下文件的4种方法
2021/07/02 Java/Android
MySQL的prepare使用以及遇到的bug
2022/05/11 MySQL
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js