事先知道序列中的记录都位于某个小区间段[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很大时,桶排序便不再适用。
桶排序案例分析:
将待排序的数组从后往前排。