之前介绍的排序都是根据比较大小的原理来的,这两种排序则不是根据比较大小来的。
计数:
桶原理,把数依次放到对应的桶里面,再从桶里捡出来。
基数:
依次根据个位,十位...把相应的数字扔进桶里,再拿出来
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;
}
};
|