桶排序
得闲无聊想到了以后去工作去面试,由面试想到了面试题,想到了一些大数据排序的题目,又想到了桶排序
于是练练手,用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
另外,桶排序只适合用在特别的场合,例如用在数字的排序。