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 }