声明:本算法参考了百度百科中的相关文章,表示感谢~~~ /* * 基数排序 * 1)假设待排序的元素是由dk-1dk-2...d3d2d1个关键字组成 * 2)先按关键字d1进行排序,然后在前次排序的基础上,按照d2 * 排序,直到dk-1 * 稳定性:稳定的 * 空间复杂度 n*radix保存收集数据的空间 其中radix为关键字取值范围 * radix个指示每个队列元素个数的空间 * 时间复杂度: O(d(n+radix)) O(n) 一趟分配的时间复杂度 * O(radix) 一趟收集的时间复杂度 */ /* * 求元素的最大位数 */ int MaxBit(int a[], int n) { //初始时,最大位数为1 int max = 1; //记录位数 int count = 0; int temp; for(int i=0; i<n; i++) { temp = a[i]; count = 0; while(temp) { count++; temp /= 10; } if(count > max) { max = count; } } return max; } /* * 基数排序 */ void RadixSort(int a[], int n) { //求出最大的位数 int d = MaxBit(a, n); //用来计数 int count[10]; //用来保存数据的桶 int temp[10][100]; int radix = 1; int k = 0, index = 0; //需要进行d次排序 for(int i=0; i<d; i++) { //每次分配前,清空计数器 for(int j=0; j<10; j++) { count[j] = 0; } //将记录放到相对应的桶当中 for(int j=0; j<n; j++) { k = (a[j]/radix) % 10; temp[k][count[k]] = a[j]; count[k]++; } for(int m=0; m<10; m++) { for(int n=0; n<count[m]; n++) { a[index] = temp[m][n]; index++; } } radix *= 10; index=0; } } int main() { int a[] = {3, 8, 15, 7, 21, 6}; RadixSort(a, 6); for(int i=0; i<6; i++) { cout << a[i] << " "; } cout << endl; system("pause"); return 0; }