桶排序(Bucket Sort)

本文介绍桶排序的基本原理及其C++实现过程。桶排序是计数排序的升级版,通过将数据映射到有限数量的桶中并进行排序来提高效率。文章详细解释了桶排序的步骤,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

9.桶排序(Bucket Sort)

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

(1)算法简介

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

(2)算法描述和实现:具体算法描述如下:

<1>.设置一个定量的数组当作空桶;

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

<3>.对每个不是空的桶进行排序;

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

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

最佳情况:T(n) = O(n+k);   最差情况:T(n) = O(n+k);   平均情况:T(n) = O(n2)

/** * 桶排序:C++ */

#include <iostream>

#include <cstring>

using namespace std;

/* * 参数说明:    a -- 待排序数组    n -- 数组a的长度   max -- 数组a中最大值的范围 */

void bucketSort(int* a, int n, int max)

{    int i, j;

    int *buckets;

    if (a==NULL || n<1 || max<1)

        return ;

    // 创建一个容量为max的数组buckets,并且将buckets中的所有数据都初始化为0。

    if ((buckets = new int[max])==NULL)

        return ;

    memset(buckets, 0, max*sizeof(int));

    // 1. 计数

    for(i = 0; i < n; i++)

        buckets[a[i]]++;

    // 2. 排序

    for (i = 0, j = 0; i < max; i++)

        while( (buckets[i]--) >0 )     a[j++] = i;

    delete[] buckets;

}

int main()

{    int i;

    int a[] = {8,2,3,4,3,6,6,3,9};

    int ilen = (sizeof(a)) / (sizeof(a[0]));

    cout << "before sort:";

    for (i=0; i<ilen; i++)      cout << a[i] << " ";

    cout << endl;

    bucketSort(a, ilen, 10); // 桶排序

    cout << "after  sort:";

    for (i=0; i<ilen; i++)       cout << a[i] << " ";

    cout << endl;

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值