分桶排序详解及实例实现/简单分桶

一、什么是桶排序

桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶里。每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。

对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要

二、实现方式

  1. 设置一个定量的数组当作空桶子。
  2. 寻访序列,并且把项目一个一个放到对应的桶子去。
  3. 对每个不是空的桶子进行排序。
  4. 从不是空的桶子里把项目再放回原来的序列中。

三、实现实例

伪代码:

function bucket-sort(array, n) is
  buckets ← new array of n empty lists
  for i = 0 to (length(array)-1) do
    insert array[i] into buckets[msbits(array[i], k)]
  for i = 0 to n - 1 do
    next-sort(buckets[i])
  return the concatenation of buckets[0], ..., buckets[n-1]

元素分布在桶中:

元素分布在桶中:

*来自wiki https://zh.wikipedia.org/wiki/桶排序

四、关于桶排序的性能参数

1、时间复杂度

最坏时间复杂度: O ( n 2 ) O(n^2)
平均时间复杂度: O ( n + k ) O(n + k)
最好时间复杂度: O ( n + k ) O(n + k)

2、空间复杂度

最坏空间复杂度: O ( n k ) O(n \cdot k)

3、是否稳定

稳定

4、适用于何类型存储

顺序存储和链式存储

五、代码实现

分桶原则使用简单分桶
关于归约化分桶有空再写…

*实现算法部分参考自
https://www.geeksforgeeks.org/bucket-sort-2/
*分桶原则参考自
https://mp.weixin.qq.com/s/qq8-anybC8aYX5dnyrXmwA

算法部分

void bucketSort(int arr[],int len)
{
    // 1 找到最大值
    int max = arr[0];
    for (int i = 1; i < len; i++)
    {
        if (arr[i] > max)
            max = arr[i];
    }
    // 2 找到最小值
    int min = arr[0];
    for (int i = 1; i < len; i++)
    {
        if (arr[i] < min)
            min = arr[i];
    }
    // 3 根据最大值和最小值创建桶
    int bucketNum = max/10 - min/10 + 1 ;
    vector<int> b[bucketNum];
    // 4 根据简单分桶,把元素放入桶中
    for (int i = 0; i < len; i++)
    {
        int bi = (arr[i] - min )/10;
        b[bi].push_back(arr[i]);
    }
    // 5 每个桶内单独排序
    for (int i = 0; i < bucketNum; i++)
    {
        if (b[i].size() > 0)    //当桶内元素大于0才排序
        {
            sort(b[i].begin(), b[i].end());
        }
    }
    // 6 将桶内的元素放入arr中
    int index = 0;
    for (int i = 0; i < bucketNum; i++)
    {
        for (int j = 0; j < b[i].size(); j++)
        {
            arr[index++] = b[i][j];
        }   
    }
}

实例部分

http://www.huangjihao.com/index.php/archives/807

发布了35 篇原创文章 · 获赞 1 · 访问量 1837

猜你喜欢

转载自blog.csdn.net/qq_40672635/article/details/104948630