之前介绍的排序都是根据比较大小的原理来的,这两种排序则不是根据比较大小来的。
计数:
桶原理,把数依次放到对应的桶里面,再从桶里捡出来。
基数:
依次根据个位,十位...把相应的数字扔进桶里,再拿出来
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
class RadixSort { public : int * radixSort( int * A, int n) { int temp[n]; int d=1; int count[10]={0}; int i,x,k; int divide=1; int para=1; for ( i=0;i<n;i++) //首先确定下这么多数的最高位是哪一位 { while (*(A+i)>para*10) { para*=10; d++; } } for ( x=1;x<=d;x++) //对于每一位都会走一个循环 { for ( int i=0;i<10;i++) //每个循环之前要清空count count[i]=0; for ( i=0;i<n;i++) //这一步是确定 0-9个桶,每个桶中会被塞进几个数 { k=(A[i]/divide)%10; count[k]++; } for ( i=1;i<10;i++) { count[i]+=count[i-1]; //得到第i个桶与它之前的桶中共有多少个元素 } //这个会为后来的返回数组提供下标 for ( int i=n-1;i>=0;i--) //从后往前,把A中的数分别放到temp中 { k=(A[i]/divide)%10; temp[count[k]-1] =A[i]; count[k]--; } for ( int i=0;i<n;i++) A[i]=temp[i]; divide*=10; } return A; } }; |