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 相关文章推荐
了解jQuery技巧来提高你的代码(个人觉得那个jquery的手册很不错)
Feb 10 Javascript
jQuery 过滤not()与filter()实例代码
May 10 Javascript
jquery 添加节点的几种方法介绍
Sep 04 Javascript
jquery 使用简明教程
Mar 05 Javascript
js获取字符串最后一位方法汇总
Nov 13 Javascript
js中数组排序sort方法的原理分析
Nov 20 Javascript
jQuery团购倒计时特效实现方法
May 07 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
Jun 12 Javascript
PHP自动加载autoload和命名空间的应用小结
Dec 01 Javascript
深入浅出 Vue 系列 -- 数据劫持实现原理
Apr 23 Javascript
解决Vue大括号字符换行踩的坑
Nov 09 Javascript
教你一步步实现一个简易promise
Nov 02 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
967 个函式
2006/10/09 PHP
WordPress判断用户是否登录的代码
2011/03/17 PHP
PHP中最容易忘记的一些知识点总结
2013/04/28 PHP
使用PHP编写的SVN类
2013/07/18 PHP
PHP+redis实现添加处理投票的方法
2015/11/14 PHP
PHP7中I/O模型内核剖析详解
2019/04/14 PHP
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
理解Javascript_03_javascript全局观
2010/10/11 Javascript
浅析JavaScript中的类型和对象
2013/11/29 Javascript
jQuery如何将选中的对象转化为原始的DOM对象
2014/06/09 Javascript
ext前台接收action传过来的json数据示例
2014/06/17 Javascript
jQuery Html控件基本操作(日常收集整理)
2016/03/11 Javascript
javascript事件处理模型实例说明
2016/05/31 Javascript
小程序tab页无法传递参数的方法
2018/08/03 Javascript
JS实现换肤功能的方法实例详解
2019/01/30 Javascript
nodeJS与MySQL实现分页数据以及倒序数据
2020/06/05 NodeJs
JavaScript缺少insertAfter解决方案
2020/07/03 Javascript
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
2020/08/13 Javascript
[03:42]2018完美盛典-《加冕》
2018/12/16 DOTA
python client使用http post 到server端的代码
2013/02/10 Python
python基于xml parse实现解析cdatasection数据
2014/09/30 Python
python中常用的九种预处理方法分享
2016/09/11 Python
Django数据库操作的实例(增删改查)
2017/09/04 Python
Pytorch中的VGG实现修改最后一层FC
2020/01/15 Python
Django 返回json数据的实现示例
2020/03/05 Python
Python colormap库的安装和使用详情
2020/10/06 Python
使用HTML5拍照示例代码
2013/08/06 HTML / CSS
Shell如何接收变量输入
2016/08/06 面试题
护士毕业生自荐信
2014/02/07 职场文书
党的群众路线教育实践活动心得体会900字
2014/03/07 职场文书
难忘的一天教学反思
2014/04/30 职场文书
公司门卫工作职责
2014/06/28 职场文书
学校运动会报道稿
2014/09/23 职场文书
保险公司增员口号
2015/12/25 职场文书
深入浅出的讲解:信号调制到底是如何实现的
2022/02/18 无线电
python实现会员信息管理系统(List)
2022/03/18 Python