桶排序

简介: 概念:桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。 桶排序 (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]
相关文章
|
5月前
|
搜索推荐 算法 Java
桶排序就是这么容易
桶排序就是这么容易
32 0
|
6月前
|
存储 搜索推荐 算法
C++桶排序的实现
C++桶排序的实现
|
6月前
|
搜索推荐 算法 C++
C++基数排序的实现
C++基数排序的实现
|
6月前
|
机器学习/深度学习 算法 搜索推荐
C++018-C++桶排序及其应用
C++018-C++桶排序及其应用
C++018-C++桶排序及其应用
|
算法 容器
计数排序与基数排序
计数排序与基数排序
152 0
|
算法 搜索推荐 Java
基数排序(桶排序)算法
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”
152 0
基数排序(桶排序)算法
基数排序
概念:基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。 基数排序基于分别排序,分别收集,所以是稳定的。但基数排序的性能比桶排序要略差,每一次关键字的桶分配都需要O(n)的时间复杂度,而且分配之后得到新的关键字序列又需要O(n)的时间复杂度。假如待排数据可以分为d个关键字,则基数排序的时间复杂度将是O(d*2n) ,当然d要远远小于n,因此基本上还是线性级别的。 基数排序的空间复杂度为O(n+k),其中k为桶
|
存储 搜索推荐 C语言
常见的排序算法 - 桶排序
常见的排序算法 - 桶排序
169 0
|
存储 搜索推荐
排序算法-计数排序和桶排序
排序算法-计数排序和桶排序
排序算法-计数排序和桶排序
|
搜索推荐 算法 C++
C++实现排序 - 03 计数排序、桶排序和基数排序
今天我们继续来整理与 O(n+k) 有关的三个排序算法,即计数排序、桶排序和基数排序。
592 0
C++实现排序 - 03 计数排序、桶排序和基数排序