桶排序

简介: 概念:桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。 桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。 桶排序最好情况下使用线性时间O(n),桶排序的时间复杂度,取决与对各个桶之间数据进行排序的时间复杂度,因为其它部分的时间复杂度都为O(n)。很显然,桶划分的越小,各个桶之间的数据越少,排序所用的时间也会越少。但相应的空间消耗就会增大。

概念:桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。

    桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。

    桶排序最好情况下使用线性时间O(n),桶排序的时间复杂度,取决与对各个桶之间数据进行排序的时间复杂度,因为其它部分的时间复杂度都为O(n)。很显然,桶划分的越小,各个桶之间的数据越少,排序所用的时间也会越少。但相应的空间消耗就会增大。




*算法描述:

设置一个定量的数组当作空桶;

遍历输入数据,并且把数据一个一个放到对应的桶里去;

对每个不是空的桶进行排序;

从不是空的桶里把排好序的数据拼接起来。

       if (arr.length === 0) {
       return arr;
       }

       var i;
       var minValue = arr[0];
       var maxValue = arr[0];
       for (i = 1; i < arr.length; i++) {
           if (arr[i] < minValue) {
               minValue = arr[i]; // 输入数据的最小值
           } else if (arr[i] > maxValue) {
               maxValue = arr[i]; // 输入数据的最大值
           }
       }

       // 桶的初始化
       var DEFAULT_BUCKET_SIZE = 5; // 设置桶的默认数量为5
       // 桶的个数
       bucketSize = parseInt(bucketSize) > 0 ? parseInt(bucketSize) : DEFAULT_BUCKET_SIZE;
       // 分成 bucketSize 个桶,桶所占用的范围
       var bucketCount = Math.floor((maxValue - minValue) / bucketSize) + 1;
       // 初始化桶
       var buckets = new Array(bucketCount);
       for (i = 0; i < buckets.length; i++) {
           buckets[i] = [];
       }

       // 利用映射函数将数据分配到各个桶中
       for (i = 0; i < arr.length; i++) {
           buckets[Math.floor((arr[i] - minValue) / bucketSize)].push(arr[i]);
       }

       arr.length = 0;
       for (i = 0; i < buckets.length; i++) {
           insertionSort(buckets[i]); // 对每个桶进行排序,这里使用了插入排序
           for (var j = 0; j < buckets[i].length; j++) {
               arr.push(buckets[i][j]);
           }
       }

      return arr;

       function insertionSort(arr) {
           if (arr == null || arr.length < 2) {
               return arr;
           }
           for (let i = 1; i < arr.length; i++) {
               for (let j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {
                   let temp = arr[j];
                   arr[j] = arr[j + 1];
                   arr[j + 1] = temp;
               }
           }
           return arr;
           }
   }
   var arr = [8, 39, 400, 500, 3, 4, 20, 44, 440];
   console.log(arr); // [8, 39, 400, 500, 3, 4, 20, 44, 440]
   bucketSort(arr, 10);
   console.log(arr); // [3, 4, 8, 20, 39, 44, 400, 440, 500]
相关文章
|
3月前
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
402 1
|
IDE Java 开发工具
Java 开发神器 Lombok:告别冗余,拥抱优雅!
Java 开发神器 Lombok:告别冗余,拥抱优雅!
213 0
|
API 异构计算
SurfaceView 和 TextureView
SurfaceView 和 TextureView
640 0
|
API Android开发
android兼容oppo手机刘海屏解决方案
引用自OPPO官方文档,这里缩减了一些内容,选取重要内容,包括oppo沉浸式的兼容。 转载请标明出处: https://blog.
30057 0
|
5天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
390 93
|
6天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~