算法-桶排序
前置知识
- 哈希表
- 一种排序(如插入排序)
思路
我们现在有一个序列,怎么对它排序?
这是一个非常经典的问题,这里我们使用一个经典算法——桶排序解决。
这里有一个序列,要对它升序排序
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];
}
}