排序算法-基数排序

说明

     在之前所介绍过的排序方法,都是属于「比较性」的排序法,也就是每次排序时,都是比较整个键值的大小以进行排序。这里所要介绍的「基数排序法」(radix sort)则是属于「分配式排序」(distribution sort), 基数排序法又称「桶子法」(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些「桶」中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的比较性排序法。
解法

     基数排序的方式可以采用LSD(Least sgnificant digital)或MSD(Most sgnificant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。以LSD为例,假设原来有一串数值如下所示:

73, 22, 93, 43, 55, 14, 28, 65, 39, 81
首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:

0       1        2        3       4       5       6       7       8       9


         81                                 65                                 39

                            43     14     55                       28

                            93    

                   22     73

接下来将这些桶子中的数值重新串接起来,成为以下的数列:

81, 22, 73, 93, 43, 14, 55, 65, 28, 39

接着再进行一次分配,这次是根据十位数来分配:

0       1       2       3       4       5       6       7       8       9


                  28     39

         14     22              43     55     65     73     81     93

接下来将这些桶子中的数值重新串接起来,成为以下的数列:

14, 22, 28, 39, 43, 55, 65, 73, 81, 93
这时候整个数列已经排序完毕;如果排序的对象有三位数以上,则持续进行以上的动作直至最高位数为止。
LSD的基数排序适用于位数小的数列,如果位数多的话,使用MSD的效率会比较好,MSD的方式恰与LSD相反,是由高位数为基底开始进行分配,其他的演算方式则都相同。

代码:

void basesort(int number[],int maxbitnum)//maxbitnum最大数值的位数
{
	int temp[10][10] = {0};
	int order[10] = {0};
	int i,j,k,n,lsd;

	int highbitnumber = 1; //最高位对应的权值,1、10、100、...
	while(maxbitnum-- > 1)
		highbitnumber *= 10;

	k = 0;
	n = 1;
	while(n <= highbitnumber) 
	{
		for(i=0;i


 

你可能感兴趣的:(排序算法)