全栈工程师开发手册 (作者:栾鹏)

js系列教程5-数据结构和算法全解

js排序算法详解-桶排序

一看到这个名字就会觉得奇特,几个意思,我排序还要再准备几个桶不成?还真别说,想用桶排序还得真准备几个桶,但是此桶非彼桶,这个桶是用来装数据用的。其实桶排序和计数排序还有点类似,计数排序是找一个空数组把值作为下标找到其位置,再把出现的次数给存起来,这似乎看似很完美,但也有局限性,不用小编说相信读者也能明白,既然计数是把原数组的值当做下标来看待,那么该值必然是整数,那假如出现小数怎么办?这时候就出现了一种通用版的计数排序——桶排序。

小编觉得桶排序可以这么理解,它是以步长为分隔,将最相近数据分隔在一起,然后再在一个桶里排序。好了,现在有个概念,步长是什么玩意?这么来说吧,比如在知道十位的情况下48和36有比较的必要吗?显然没有,十位就把你干下去了,还比什么?那在这里可以简单的把步长理解为10,桶排序就是这样,先把同一级别的分到一组,由同一级别的元素进行排序。

代码实现:

@param array 数组
@param num 桶的数量function bucketSort(array, num) {if (array.length <= 1) {return array;}var len = array.length, buckets = [], result = [], min = max = array[0], space, n = 0;var index = Math.floor(len / num) ;while(index<2){num--;index = Math.floor(len / num) ;}console.time('桶排序耗时');for (var i = 1; i < len; i++) {min = min <= array[i] ? min : array[i];max = max >= array[i] ? max : array[i];}space = (max - min + 1) / num;  //步长for (var j = 0; j < len; j++) {var index = Math.floor((array[j] - min) / space);if (buckets[index]) { // 非空桶,插入排序var k = buckets[index].length - 1;while (k >= 0 && buckets[index][k] > array[j]) {buckets[index][k + 1] = buckets[index][k];k--;}buckets[index][k + 1] = array[j];} else { //空桶,初始化buckets[index] = [];buckets[index].push(array[j]);}}while (n < num) {result = result.concat(buckets[n]);n++;}console.timeEnd('桶排序耗时');return result;
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(bucketSort(arr,4));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50];

但是这边有个坑点,就是桶的数量不能过多,也就说说至少两个桶!为什么?你试下就知道了!

附图理解:

js排序算法详解-桶排序相关推荐

  1. js排序算法详解-计数排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-计数排序 计数排序就是遍历数组记录数组下的元素出现过多次,然后把这个元素找个位置先安置下来,简单点说就是以原数 ...

  2. js排序算法详解-希尔排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-希尔排序 希尔排序,直接上图: 像这个算法看图理解起来并不是很难,就像比赛一样,1-6一组,2-7一组,每差5 ...

  3. js排序算法详解-选择排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-选择排序 相对于冒泡排序还有一种类似的方法就是选择排序,顾名思义就是选择性排序,什么意思呢? 这么来理解,假设 ...

  4. 数据结构 7 基础排序算法详解 鸡尾酒排序法、了解钟摆排序实现

    前言 上节,我们已经通过对冒泡算法的优化.能够达到我们预想的结果.比较次数的减少.本节将继续在冒泡排序的基础上进行优化.能够达到刚好的效果. 鸡尾酒排序

  5. js排序算法详解-基数排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-基数排序 其实基数排序和桶排序挺类似的,都是找一个容器把属于同一类的元素装起来,然后进行排序.可以把基数排序类 ...

  6. js排序算法详解-归并排序

    js系列教程5-数据结构和算法全解 js排序算法详解-归并排序 归并排序其实可以类比二分法,二分法其实就是二等分的意思,简而言之就是不断和新序列的中间值进行比较.归并排序似乎有异曲同工之妙,什么意思呢 ...

  7. js排序算法详解-堆排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-堆排序 这种排序方式呢,理论性太强,看动图的时候满脸写着懵逼,多看几遍似乎明白了编者的意图,但是要把这种理论的 ...

  8. js排序算法详解-快速排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-快速排序 既然是快速排序,那顾名思义一定很快,快的连小编都被懵逼了好几圈!建议先不要看动图,先看第一种写法: ...

  9. js排序算法详解-冒泡排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-冒泡排序 1.1 原始人冒泡排序 function bubbleSort(arr) {var len = ar ...

最新文章

  1. PyTorch神经网络集成技术
  2. vuex中组合action的使用
  3. CSS的单位及css3的calc()及line-height百分比
  4. Ext FormPanel布局 (一行显示两对控件元素)
  5. SpringBoot时间戳与MySql数据库记录相差14小时排错
  6. blast2go mysql_Blast2go本地化教程
  7. githug-54-git练习
  8. 韩顺平循序渐进学java 第18讲 查找
  9. Unity实现扫描透视效果
  10. 【问题思考】二重积分积分限上的x和积分内部的x有什么区别?【几何直观】
  11. 什么是UserAgent以及使用浏览器查看UserAgent的方法
  12. 用代码实现一场烟花盛宴,提前祝大家2022新春快乐
  13. Java代码的.equest的空指针异常
  14. 致远项目管理SPM系统之项目立项审批
  15. 计算机课程体系改革,试论改革教学内容和考试方式构建计算机公共课程体系
  16. DDD 领域概念字典
  17. 十种免费网站访问分析工具
  18. 【Java基础系列教程】第八章 Java面向对象详解(三)_抽象类、接口、内部类、深拷贝与浅拷贝
  19. SEO吸引用户访问网站的方法是什么?
  20. 【前端基础总结--JavaScript】

热门文章

  1. 语音识别项目报告.pdf
  2. 语音 识别_语音识别_qq语音识别 - 云+社区 - 腾讯云
  3. 手机游戏开发 - 究竟要做什么、怎么做(中)
  4. MongoDB更新文档(非常详细,不要错过~)
  5. ijkplayer-hook协议实现分析
  6. CMFCPropertyGridCtrl 的简单教程
  7. oracle ORA-00054 资源正忙
  8. IDEA中控制台中文乱码问题
  9. 背景图片铺不满全屏时处理
  10. DIV+CSS布局总结