桶排序算法

  事先知道序列中的记录都位于某个小区间段[0,m)内。 将具有相同值的记录都分配到同一个桶中,然后依次按照编号从桶中取出记录,组成一个有序序列。

 

桶式排序算法

template <class Record>
class BucketSorter:public Sorter<Record,Compare> {
    //桶式排序类
    public:
           void Sort(Record Array[],int n,int max);
};
template <class Record>
void BucketSorter<Record>::Sort(Record Array[], int n,int max) { 
     int* TempArray=new Record[n];   //临时数组
     int* count=new int[max];//小于等于i的元素个数
     int i;
     for (i=0;i<n;i++)  TempArray[i]=Array[i];
     //所有计数器初始都为0
     for (i=0;i<max;i++)        count[i]=0;
     //统计每个取值出现的次数
     for (i=0;i<n;i++)   count[Array[i]]++;
     //统计小于等于i的元素个数
     for (i=1;i<max;i++)   count[i]=count[i-1]+count [i];  
     //按顺序输出有序序列
     for (i=n-1;i>=0;i--)         //从后向前去安排顺序
         Array[--count[TempArray[i]]] = TempArray[i];
}

 

算法分析:

  • 时间代价:

–  统计计数时:Θ(n+m)

–  输出有序序列时循环n次

–  总的时间代价为Θ(m+n)

–  适用于m相对于n很小的情况

  • 空间代价:

–  m个计数器,长度为n的临时数组,Θ(m+n)

  • 属于稳定性排序

注意:当m相对n很大时,桶排序便不再适用。

 

桶排序案例分析:

将待排序的数组从后往前排。

 

posted @ 2020-04-28 15:23  neverstopcoding  阅读(191)  评论(0编辑  收藏  举报