桶排序

来源:互联网 发布:catia软件安装 编辑:程序博客网 时间:2024/05/22 07:59
```#include <iostream>#include <iomanip>using namespace std;const int SIZE=12;int numberOfDigits(int[],int);  //求数位void distributeElement(int[],int[][SIZE+1],int); //分布void collectElement(int[],int[][SIZE+1]);  //收集void zeroBucket(int[][SIZE+1]);  //清空void BucketSort(int[]);  // 桶排序int main(){    int Array[SIZE]={19,13,5,27,1,26,31,16,2,9,11,21};    cout<<"The array is :"<<endl;    for (int i=0;i<SIZE;i++)        cout<<setw(3)<<Array[i];    cout<<endl;    BucketSort(Array);    cout<<"\nThe new array is :\n";    for (int j=0;j<SIZE;j++)        cout<<setw(3)<<Array[j];    system("pause");}void BucketSort(int a[]){    int bucket[10][SIZE+1]={0};//10代表从0~9 10个数字 而size+1为了每个桶可以装下所有的元素    int totaldigit=numberOfDigits(a,SIZE);//计算出数组里最大数的位数    cout<<totaldigit<<endl;//显示出位数    for(int i=1;i<=totaldigit;i++)//先排最低位  最后排最高位 i代表正在排序的位数    {         distributeElement(a,bucket,i);//分配         collectElement(a,bucket);//收集         zeroBucket(bucket);//清空桶    }}int numberOfDigits(int a[],int n){    int biggest=a[0];    for(int i=0;i<n;i++)//找到最大的元素      if(a[i]>biggest)      biggest=a[i];    int num=0;    while(biggest>0)//计算出最大的元素的位数    {        num++;        biggest/=10;    }    return num;}void distributeElement(int a[],int bucket[][SIZE+1],int n)//a[]为要排序的数组  buck为桶 n为正在排序的位数{    int digit=10;    int bucketnum;    for(int i=1;i<n;i++)//利用位数来计算digit 来取第n位上的数字 第一位为10 以此类推        digit*=10;    for(int i=0;i<SIZE;i++)//遍历整个数组    {        bucketnum=(a[i]%digit-a[i]%(digit/10))/(digit/10);//计算出n位上的数字值        bucket[bucketnum][0]++;//统记n位上的值为bucknum的数的个数        bucket[bucketnum][bucket[bucketnum][0]]=a[i];//依次将n位上的值放到桶中相应的位置上    }}void collectElement(int a[],int bucket[10][SIZE+1]){    int countnum=0;    for(int i=0;i<10;i++)//从第0个桶开始收集        for(int j=1;j<=bucket[i][0];j++)//遍历每个桶        a[countnum++]=bucket[i][j];//将元素重新收集到数组里}void zeroBucket(int bucket[10][SIZE+1]){    for(int i=0;i<10;i++)        for(int j=0;j<SIZE+1;j++)        bucket[i][j]=0;}

“`

1 0
原创粉丝点击