【算法】桶排序

算法-桶排序


前置知识
  • 哈希表
  • 一种排序(如插入排序)

思路

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

这里有一个序列,要对它升序排序
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];
    }
}

练习
  • 洛谷P1177 【模板】排序

你可能感兴趣的:(算法,#,排序,算法,哈希算法,排序算法)