写里一个基数排序:


	/**
	 * 基数排序
	 * @param arr
	 */
	public static void radioSort(int[] arr) {
		// 首先找到最大的数
		int maxNum = Integer.MIN_VALUE;
		for (int i = 0; i< arr.length; i++) {
			if (maxNum < arr[i]) {
				maxNum = arr[i];
			}
		}
		
		// 求出最大的数的位数,这样才能知道基数排序需要排几次
		int ddcount = String.valueOf(maxNum).length();
		
		// 进行归并排序,最外层循环是归并排序的次数, n用来记录当前排序的位数,比如当n=1时,排序的是个位,n = 10时排序的是十位。。。
		for(int i = 0, n = 1; i < ddcount; i++, n*=10) {
			// 这里是归并排序的桶,用一个二维数组来实现,一共10个桶,每个桶中最多可以放arr.length个数字
			int[][] temp = new int[arr.length][10];
			// 这是每个桶中当前数字的个数的数组
			int[] counts = new int[10];
			// 这里需要遍历所有数组元素,取出来完成归并排序
			for(int j = 0; j < arr.length; j++) {
				// 取出每个数的对应位
				int num = (arr[j] /n)% 10;
				temp[counts[num]][num] = arr[j];
				counts[num]++;
			}
			// 完成一轮排序之后,需要按顺序取出来放到arr数组中
			int index = 0;
			for(int j = 0; j < 10; j++) {
				// 对应的counts位不为0,说明这个桶里有数据
				if (counts[j] != 0) {
					for (int k = 0; k < counts[j]; k++) {
						arr[index++] = temp[k][j];
					}
					// 把桶中的数据复制到arr数组中后, 把桶中的数组个数清零。
					counts[j] = 0;
				}
			}
			
		}
	}```

Q.E.D.