基数排序:
基数排序的思想就是将待排数据中的每组关键字依次进行桶分配
基数排序:LSD和MSD方法。LSD的基数排序适用于位数小的数列,如果位数多,使用MSD效率会更高。
MSD与LSD相反,由高位数为基底开始分配。
LSD为例:73, 22, 93, 43, 55, 14, 28, 65, 39, 81
首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中。
接下来将这些桶子中的数值重新串接起来,成为以下的数列:81, 22, 73, 93, 43, 14, 55, 65, 28, 39
接着再进行一次分配,这次是根据十位数来分配:
1 int maxbit(int data[], int n) //辅助函数,求数据的最大位数 2 { 3 int d = 1; //保存最大的位数 4 int p = 10; 5 for(int i = 0; i < n; ++i) 6 { 7 while(data[i] >= p)//复杂度(dN) 8 { 9 p *= 10; 10 ++d; 11 } 12 } 13 return d; 14 } 15 16 void radixsort(int data[], int n) //基数排序 17 { 18 int d = maxbit(data, n);//求得数组中所有的数据的最大位数 19 int *tmp = new int[n];//存放每一位基数排序的结果 20 int *count = new int[10]; //计数器 21 int i, j, k; 22 int radix = 1;//关键字 23 for(i = 1; i <= d; i++) //进行d次排序 24 { 25 for(j = 0; j < 10; j++) 26 count[j] = 0; //每次分配前清空计数器 27 for(j = 0; j < n; j++) 28 { 29 k = (data[j] / radix) % 10; //统计每个桶中的记录数 30 count[k]++; 31 } 32 for(j = 1; j < 10; j++) 33 count[j] = count[j - 1] + count[j]; //将tmp中的位置依次分配给每个桶,为count[k]在tmp中预留位置。把桶累计起来。 34 for(j = n - 1; j >= 0; j--) //将所有桶中记录依次收集到tmp中 35 { 36 k = (data[j] / radix) % 10; 37 tmp[count[k] - 1] = data[j];//把桶串起来 38 count[k]--; 39 } 40 for(j = 0; j < n; j++) //将临时数组的内容复制到data中 41 data[j] = tmp[j]; 42 radix = radix * 10;//每次更新关键字 43 } 44 delete[]tmp; 45 delete[]count; 46 }