基数排序

基数排序属于“分配式排序”(distributionsort),基数排序法又称“桶子法”(bucketsort)或binsort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,借以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O(nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的比较性排序法。

其为桶排序的一种延伸,对于一串数值序列,如果首先根据个位依次把数据放入0~9个桶中,然后遍历取出,则此时所有的个位是有序的。然后再重用这些桶,对其十位进行排序,因为桶排序是稳定排序,所以十位排序完后,每个桶之间是有序的,桶内因为保留了之前排序的顺序,所以依然是有序的。若最终完成了所有位的排序,整个序列必然是有序的。

 1 int GetBit(int num, int ord)//获得某一位的数值
 2 {
 3     while (ord--)
 4         num /= 10;
 5     return num % 10;
 6 }
 7 void RadixSort(int num[], int len)
 8 {
 9     int MaxBit = 0;
10     for (int i = 0;i < len;i++)
11         MaxBit = (MaxBit < log10(num[i]) ? log10(num[i]):MaxBit);//获取最长位数
12     int temp[10][100];
13     for(int i=0;i<2;i++)
14     {
15         memset(temp, 0, sizeof(temp));
16         for (int j = 0;j < len;j++)
17         {
18             int nowbit = GetBit(num[j], i);
19             temp[nowbit][++temp[nowbit][0]] = num[j];//把每个数按当前排序位存入相应的桶,temp[][0]保存了此时桶内占用情况,数值从temp[][1]开始存放
20         }
21         int pos = 0;
22         for (int i = 0;i < 10;i++)
23             for (int j = 1;j <= temp[i][0];j++)//按序取出数值
24                 num[pos++] = temp[i][j];
25     }
26 }

 

posted @ 2016-08-16 08:28  Luke_Ye  阅读(293)  评论(0编辑  收藏  举报