您的位置:首页 > 其它

算法基础之排序篇-基数排序

2012-08-14 10:33 274 查看
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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: