桶排序

简介: 概念:桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。 桶排序 (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月前
|
搜索推荐 算法 Java
桶排序就是这么容易
桶排序就是这么容易
18 0
|
3月前
|
搜索推荐 算法
计数排序就是这么容易
计数排序就是这么容易
16 0
|
4月前
|
存储 搜索推荐 算法
C++桶排序的实现
C++桶排序的实现
|
4月前
|
存储 搜索推荐 C++
C++计数排序的实现
C++计数排序的实现
|
4月前
|
机器学习/深度学习 算法 搜索推荐
C++018-C++桶排序及其应用
C++018-C++桶排序及其应用
C++018-C++桶排序及其应用
|
9月前
|
搜索推荐 算法
计数排序详解
计数排序详解
|
算法 容器
计数排序与基数排序
计数排序与基数排序
145 0
|
算法 搜索推荐 Java
基数排序(桶排序)算法
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”
144 0
基数排序(桶排序)算法
|
存储 搜索推荐 算法
计数排序
概念:计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
|
人工智能 搜索推荐 算法
C/C++ 计数排序
计数排序是一种非基于比较的排序算法,该算法于1954年由提出。找出待排序的数组中最大和最小的元素统计数组中每个值为i的元素出现的次数,存入数组C的第i项对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)反向填充目标数组:将每个元素i放在新数组的第C[i]项,每放一个元素就将C[i]减去1它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n + k)(其中k是整数的范围),快于任何比较排序算法。当然这是一种牺牲空间换取时间的做法,而且当O(k)&gt;......
131 0
C/C++ 计数排序