您的位置:首页 > 其它

算法导论学习笔记——基数排序

2011-08-10 23:43 281 查看
/**
* 基数排序:n个d位数进行排序,先从最低有效位进行,由于每位数字都界于0到9(只考虑整数),
* 可以用计数排序对每一位进行排序,重复这一过程直到对所有的d位数字都进行了排序。
* 由于计数排序的复杂度为O(n+k),所以基数排序的时间复杂度为O(d(n+k))
*/
public class RadixSort {

/**
* 用计数排序将arr数组按第i位排序
* @param arr  要排序的数组
* @param i   第i位
*/
static void countingSort(int arr[],int i){
//存放arr中每个元素第i位的值
int a[] = new int[arr.length];
//b数组存放arr中现在的值,把排序结果放在 arr数组中
int b[] = new int[arr.length];
//c存储从0到9每个元素在a中出现的次数,故c的长度为10。
int c[] = new int[10];
//把arr中的元素放到b数组中
for(int j = 0;j<arr.length;j++){
b[j] = arr[j];
}
//计算每个元素第i位的值,然后放入a数组中
for(int j = 0;j<b.length;j++){
int temp = (int)Math.pow(10, i);
int r =  b[j]%temp;
if(i>1){
int x = (int)Math.pow(10, (i-1));
r=r/x;
}
a[j]=r;
}
//c[j]中存放了等于j的元素的个数
for(int j = 0;j<a.length;j++){
c[a[j]]++;
}
//c[j]存放小于或等于j的元素个数
for(int j = 1;j<10;j++){
c[j]+=c[j-1];
}
//由于c[r]存放小于等于r的元素个数(r=a[j]),所以r应该放在arr数组中的c[r]位置(由于数组从0开始,所以要减1)
for(int j = a.length-1;j>=0;j--){
int r = a[j];
arr[c[r]-1] = b[j];
//每次c[r]减1可以保证下一个等于r的相同元素,落在arr[c[r]-1]的前一个位置
c[r]--;
}
}
/**
* 外层排序算法,从最低有效位到d有效位,逐位进行排序
* @param arr  数组
* @param d  d代表 每个数是几位数
*/
static void radixSort(int arr[],int d){
for(int i = 1;i<=d;i++)
countingSort(arr,i);
}
//测试.....
public static void main(String args[]){
int arr[] = {329,457,657,839,436,720,355};
radixSort(arr,3);
for(int i = 0;i<arr.length;i++)
System.out.println(arr[i]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息