reference: 基数排序 http://blog.csdn.net/hitwhylz/article/details/9970451
八大排序 https://www.cnblogs.com/RainyBear/p/5258483.html
基数排序radixSort: 用桶bucket进行 分配、收集。
桶:0-9十个桶
分配:从个位开始,将数据分配到0-9桶中
收集:依次将0-9桶中的数据收集到原数组中
时间复杂度:O(d(r+n)) 空间复杂度:O(rd+n) 。
其中,n为关键字的个数、d为关键字最大的长度、r为关键字的基数即桶的数量
基数排序的空间复杂度较高,有两个数组的空间开销:一个存放待排序数组,一个就是所谓的桶
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 void radixSort(int a[], int len);
5 void display(int a[], int len);
6
7 int main(void)
8 {
9 int a[] = {8,4,2,3,5,1,6,9,0,7};
10 int len = sizeof(a)/sizeof(a[0]);
11 radixSort(a, len);
12
13 display(a, len);
14 return 0;
15 }
16 // 数组中最大数的位数
17 int maxlength(int a[], int len)
18 {
19 int bits = 1, p = 10, i;
20 for(i=0; i<len; i++)
21 {
22 while(a[i]>=p)
23 {
24 p = p * 10;
25 bits++;
26 }
27 }
28 return bits;
29 }
30
31 // 数据num的第pos位的数字,pos=1为个位
32 int getdigit(int num, int pos)
33 {
34 int temp = 1, i;
35 for(i=0; i<pos-1; i++)
36 temp = temp * 10;
37 return (num/temp) % 10;
38 }
39
40 void radixSort(int a[], int len)
41 {
42 int *bucket[10]; // 指针数组, 0-9的十个桶
43 int i;
44 for(i=0; i<10; i++)
45 { // 指针数组,每个指针都指向一个容量为len+1的桶
46 bucket[i] = (int *)malloc(sizeof(int) * (len+1)); // bucket 桶
47 bucket[i][0] = 0; // index为0处记录桶中数据个数
48 }
49 int bit; // 数组中最大数的长度,bit=1为个位
50 for(bit = 1; bit<=maxlength(a, len); bit++) // 从个位开始比较
51 {
52 for(i=0; i<len; i++) // 分配
53 {
54 int num = getdigit(a[i], bit);
55 int index = ++bucket[num][0];
56 bucket[num][index] = a[i];
57 }
58 int index = 0;
59 for(i=0; i<10; i++) // 收集
60 {
61 int j;
62 for(j=1; j<=bucket[i][0]; j++)
63 a[index++] = bucket[i][j]; // 收集到原数组中
64 bucket[i][0] = 0; // 复位,每个桶中的数据个数
65 }
66 }
67 }
68
69 void display(int a[], int len)
70 {
71 int i;
72 for(i=0; i<len; i++)
73 printf("%d ", a[i]);
74 printf("\n");
75 }