基数排序
基数排序属于“分配式排序”(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 }