桶排序

桶排序假设输入数据服从均匀分布,平均情况下它的时间代价为O(n);它的工作原理就是将数组分到有限数量的桶子里,每个桶子在使用其他排序算法或者递归的方式使用桶排序。

假如要对大小为[1…1000]范围内的n个数进行排序,可以把桶的大小设为10,那么就会产生100个桶。把输入的n个元素依次放到与之对应的桶中,然后对每个桶在进行排序,这样我们依次输出每个桶中的数据就得到了一个排序好的序列。将元素通过恰当的映射关系将元素尽量等数量的分到各个桶里面,这个映射关系就是桶排序算法的关键。桶标记的大小也要和值区间有对应关系。

对于桶排序的效率来说,待排序元素越均匀,桶排序的效率越高。数据均匀意味着每个桶在中间过程中容纳的元素个数都差不多,不会出现特别少或者特别多的情况。这样在排序子程序进行桶内排序的过程中会达到最优效率。但是实际应用的情况中,这种情况不会很理想的出现,所以桶排序在实际应用中的作用不是很大。

代码来自百度百科:

#include<iostream>
using namespace std;
int a[]= {1,255,8,6,25,47,14,35,58,75,96,158,657};
const int len=sizeof(a)/sizeof(int);
int b[10][len+1]= {0}; //将b全部置0
void bucketSort(int a[]);//桶排序函数
void distribute(int a[],int b[10][len+1],int digits);
void collectElments(int a[],int b[10][len+1]);
int numOfDigits(int a[]);
void zeroBucket(int b[10][len+1]);//将b数组中的全部元素置0
int main()
{
    cout<<"原始数组:";
    for(int i=0; i<len; i++)
        cout<<a[i]<<",";
    cout<<endl;
    bucketSort(a);
    cout<<"排序后数组:";
    for(int i=0; i<len; i++)
        cout<<a[i]<<",";
    cout<<endl;
    return 0;
}
void bucketSort(int a[])
{
    int digits=numOfDigits(a);      //返回最大值的位数
    for(int i=1; i<=digits; i++)
    {
        distribute(a,b,i);
        collectElments(a,b);
        if(i!=digits)
            zeroBucket(b);
    }
}
int numOfDigits(int a[])
{
    int largest=0;
    for(int i=0; i<len; i++) //获取最大值
        if(a[i]>largest)
            largest=a[i];
    int digits=0;//digits为最大值的位数
    while(largest)
    {
        digits++;
        largest/=10;
    }
    return digits;
}
void distribute(int a[],int b[10][len+1],int digits)
{
    int divisor=10;//除数
    for(int i=1; i<digits; i++)
        divisor*=10;
    for(int j=0; j<len; j++)
    {
        int numOfDigist=(a[j]%divisor-a[j]%(divisor/10))/(divisor/10);
//numOfDigits为相应的(divisor/10)位的值,如当divisor=10时,求的是个位数
        int num=++b[numOfDigist][0];//用b中第一列的元素来储存每行中元素的个数
        b[numOfDigist][num]=a[j];
    }
}
void collectElments(int a[],int b[10][len+1])
{
    int k=0;
    for(int i=0; i<10; i++)
        for(int j=1; j<=b[i][0]; j++)
            a[k++]=b[i][j];
}
void zeroBucket(int b[][len+1])
{
    for(int i=0; i<10; i++)
        for(int j=0; j<len+1; j++)
            b[i][j]=0;
}


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。