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

/**
 * 基数排序: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;j1){
				int x = (int)Math.pow(10, (i-1));
				r=r/x;
			}
			a[j]=r;		
		}
		//c[j]中存放了等于j的元素的个数
		for(int j = 0;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


你可能感兴趣的:(数据结构与算法)