【算法】桶排序

算法-桶排序


前置知识

思路

我们现在有一个序列,怎么对它排序?
这是一个非常经典的问题,这里我们使用一个经典算法——桶排序解决。

这里有一个序列,要对它升序排序
9 1 6 8 5 2 \begin{array}{cc} 9&1&6&8&5&2 \end{array} 916852
我们找出这个序列中的极大值和极小值,为 9 9 9 1 1 1,然后平均地将区间 [ 1 , 9 ] [1,9] [1,9] 分割为任意个相等的区间(这里取 3 3 3 个),为 [ 1 , 3 ] [1,3] [1,3] [ 4 , 7 ] [4,7] [4,7] [ 8 , 9 ] [8,9] [8,9]
然后我们依次遍历这个序列,将元素扔到对应的桶里面。
b u c k e t   1 : 1 2 b u c k e t   2 : 6 5 b u c k e t   3 : 9 8 bucket\>1:\begin{array}{cc}1&2\end{array}\\ bucket\>2:\begin{array}{cc}6&5\end{array}\\ bucket\>3:\begin{array}{cc}9&8\end{array} bucket1:12bucket2:65bucket3:98
然后对每一个桶排序。
b u c k e t   1 : 1 2 b u c k e t   2 : 5 6 b u c k e t   3 : 8 9 bucket\>1:\begin{array}{cc}1&2\end{array}\\ bucket\>2:\begin{array}{cc}5&6\end{array}\\ bucket\>3:\begin{array}{cc}8&9\end{array} bucket1:12bucket2:56bucket3:89
然后直接并到一起。
a n s : 1 2 5 6 8 9 ans:\begin{array}{cc}1&2&5&6&8&9\end{array} ans:125689
讲完了


算法参数
  • 平均时间复杂度: O ( n + k ) O(n + k) O(n+k)
  • 最佳时间复杂度: O ( n + k ) O(n + k) O(n+k)
  • 最差时间复杂度: O ( n 2 ) O(n ^ 2) O(n2)
  • 排序稳定性:可以稳定

极端情况

即所有元素均在一个桶中,直接爆炸


实现代码
void Sort(int a[],int n);
void BucketSort(int a[],int n){
    int mx=a[1],mn=a[1];//极大与极小元素
    for (int i=2;i<=n;i++)
    	mx=max(mx,a[i]),
    	mn=min(mn,a[i]);
    int Delta=mx-mn;//极差
    const int BucketNum=100;//100个桶
    int bucket[110][],sz[110];//桶和每个桶的大小
    for (int i=1;i<=n;i++){
        int idx=(a[i]-mn)*BucketNum/Delta);//桶编号
        bucket[idx][++sz[idx]]=a[i];
    }
    int idx=0;
    for (int i=0;i<=BucketNum;i++){
        Sort(bucket[i],sz[i]);
        for (int j=1;j<=sz[i];j++)
        	a[++idx]=bucket[i][j];
    }
}

练习
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值