基本思想
排序过程无须比较关键字,而是通过"分配"和"收集"过程来实现排序。
常用的分配排序有:箱排序和基数排序。
箱排序
排序思想
箱排序也称桶排序,
基本思想是:设置若干个箱子,依次扫描待排序的记录R[0],R[1],...,R[n-1],把关键字等于k的记录全都装入到第k个箱子里(分配),然后按序号依次将各非空的箱子首尾连接起来(收集)。
实例分析
假设序列为:49、38 、35、 97 、 76、 73 、 27、 49 ,将其进行桶排序
过程
分析可知,该序列数值的范围为0~100,数值总共为10个,我们定制10个桶,将它们十位相同的放一起,然后进行排序,可采用链队列的方式
算法描述
void BucketSon(R)
{ //对R[0..n-1]做桶排序,其中0≤R[i].key<1(0≤i<n)
for(i=0,i<n;i++) //分配过程.
将R[i]插入到桶B[「n(R[i].key)」]中; //可插入表头上
for(i=0;i<n;i++) //排序过程
当B[i]非空时用插人排序将B[i]中的记录排序;
for(i=0,i<n;i++) //收集过程
若B[i]非空,则将B[i]中的记录依次输出到R中;
}
算法分析
箱排序的时间复杂度为O(n)。
箱排序是稳定排序,箱排序只适用于关键字取值范围较小的情况,否则所需要箱子的数目太多,会导致存储空间的浪费和计算时间的增长。
基数排序
基数排序(Radix Sort)是对箱排序的改进和推广。
排序思想
从低位到高位依次对k^j(j=d-1,d-2,...,0)进行箱排序。在d趟箱排序中,所需的箱子数就是基数rd,这就是"基数排序"名称的由来。
实例分析
已知关键字序列{278,109,063,930,589,184,505,269,008,083},写出基数排序(升序)的排序过程。
过程
分析可知:该序列最大为百位数,按照排序思想,步骤如下:
第一步:按照个位数进行排序,如上图一趟排序
第二步:按照十位数进行排序,如上图二趟排序
第三步:按照百位数进行排序,如上图三趟排序
算法分析
基数排序的时间复杂度是O(d* (rd+n))。其中rd是基数,d是关键字的位数,n是元素个数。基数排序所需的辅助存储空间为O(n+rd)。
基数排序是稳定的。