1、算法描述
基数排序是根据不同位的信息将待排数据放入到特定的一些桶中,以达到排序的目的。基数排序可分为LSD和MSD。LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。
操作步骤(以LSD为例)
(1)、设定10个桶,记为0-9
(2)、如果数据有小数点的话,保持数值不变,在最右边加0以保持小数点后位数一致。
(3)、循环待排数据,取数据的最右边位(记为i=1),将数据放入标记等于其个位的桶里面。
(4)、依次从0-9个桶里面取数据,形成新的序列,i=i+1
(5)、将新的序列按右边第i位为键值分别放入对应的桶内
(6)、重复(4)(5),直到所有数据都排到了最左位(即i=max(数据位数))
2、图例
3、代码
public void sort(int[] data) {
int k = 0;
int n = 1;
int m = 1;
int max = 0;
int tempmax = 0;
for (int i = 0; i < data.length; i++) {
tempmax = data[i] > 0 ? (int) Math.log10(data[i]) : 0;
max = max < tempmax ? tempmax : max;
}
max = max + 1;
int[][] temp = new int[data.length][data.length];
int[] num = new int[data.length];
while (m <= max) {
for (int i = 0; i < data.length; i++) {
int q = ((data[i] / n) % 10);
temp[q][num[q]] = data[i];
num[q]++;
}
for (int i = 0; i < temp.length; i++) {
if (num[i] != 0) {
for (int j = 0; j < num[i]; j++) {
data[k] = temp[i][j];
k++;
}
}
num[i] = 0;
}
n *= 10;
k = 0;
m++;
}
}
4、稳定性及复杂度
稳定性:基数排序是稳定的排序
平均时间复杂度:O(nk)
空间复杂度:O(nk)