得闲无聊想到了以后去工作去面试,由面试想到了面试题,想到了一些大数据排序的题目,又想到了桶排序
于是练练手,用C++写一下桶排序的大致的代码:
有些防手误的调试代码和注释,不影响阅读
#include <iostream>
using namespace std;
// Bucket Sorting
int a[]={1,255,8,6,25,47,14,35,58,75,96,158,657};
const int len = sizeof(a)/sizeof(int);
int bucket[10][len+1]; //用bucker[i][len]存放每行的个数
void initBucket();
void showArray();
void showBucket();
void distribute(int digit);
void collect();
void bucketSort();
void bucketSort(){
showArray();
for(int i = 0,d = 1; i <3 ;d*=10,i++)
{
distribute(d);
collect();
showBucket();
showArray();
initBucket();
// getchar();
}
}
void initBucket(){
for(int i = 0; i <10; i++){
bucket[i][len] = 0;
}
}
void distribute(int digit){
for(int i =0;i< len ;i++){
int num = (a[i]%(10*digit)-a[i]%digit)/digit;
bucket[num][bucket[num][len]++] = a[i];
}
}
void collect(){
int k= 0;
for(int i =0;i<= 9;i++){
for(int j = 0;j < bucket[i][len];j++)
{
a[k++] = bucket[i][j];
}
}
}
int main()
{
bucketSort();
// cout<<sizeof(a)/sizeof(int)<<'\n'; //数组个数
// cout<<(123%100-123%10)/10; //取十位
getchar();
return 0;
}
void showArray(){
cout<<"------";
for(int i =0;i<len;i++){
cout<<a[i]<<' ';
}
cout<<'\n';
}
void showBucket(){
for(int i =0;i<= 9;i++){
for(int j = 0;j <= len;j++)
cout<<bucket[i][j]<<(char *)(j>9?" ":" ");
cout<<'\n';
}
}
桶排序是外部排序,时间复杂度为O(n)~,
可是空间占用比较大,上面十进制排序的例子中为10n,理论上来说,有10M的数据排序过程中就会占用100M的空间,如果用指针列表来作为桶存放数据,空间使用量为2n
另外,桶排序只适合用在特别的场合,例如用在数字的排序。