桶排序

```
#include 
#include 
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 :"<for (int i=0;icout<3)<cout<cout<<"\nThe new array is :\n";

    for (int j=0;jcout<3)<"pause");
}
void BucketSort(int a[])
{
    int bucket[10][SIZE+1]={0};//10代表从0~9 10个数字 而size+1为了每个桶可以装下所有的元素
    int totaldigit=numberOfDigits(a,SIZE);//计算出数组里最大数的位数
    cout<//显示出位数
    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//找到最大的元素
      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//利用位数来计算digit 来取第n位上的数字 第一位为10 以此类推
        digit*=10;
    for(int i=0;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;j1;j++)
        bucket[i][j]=0;
}

“`

你可能感兴趣的:(数据结构)