Java实现基数排序

68 阅读1分钟

基数排序和计数排序一样无需进行比较和交换,和桶排序一样利用分布和收集两种基本操作进行排序。基数排序是把每一个元素拆成多个关键字,一个关键字可以在每一个元素上同等的位置进行计数排序,一个元素拆成多个关键字可以看作是要进行几轮分桶,以一个元素最长的长度为准。
基数排序可以看成多(单)关键字的排序,可以想象成桶排序那样分桶排序,也可以像计数排序那样归约化分治。
基数排序的思想是将待排序序列中的每组关键字进行桶排序。例如整数序列[103, 9, 1,7,11,15, 25, 201, 209, 107, 5]上每个位、十位和百位上的数字看成是一个关键字。
在这里插入图片描述
源码

package com;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner s=new Scanner (System.in);
		int n=s.nextInt();
		int [] a=new int [n];
		for(int i=0;i<n;i++)
			a[i]=(int)(Math.random()*100);
		radixsort(a);
		System.out.println(Arrays.toString(a));
	}
	public static void radixsort (int[] a) {
		int max=a[0];
		for(int i=1;i<a.length;i++) {
			if(a[i]>max)
				max=a[i];
		}
		int maxLength=(max+"").length();
		int [][] bucket=new int [10][a.length];
		int [] bucketCount=new int [10];
		for(int k=0,n=1;k<maxLength;k++,n*=10) {
			for(int i=0;i<a.length;i++) {
				int dight=a[i]/n%10;
				bucket[dight][bucketCount[dight]]=a[i];
				bucketCount[dight]++;
			}
			int index=0;
			for(int i=0;i<10;i++) {
				if(bucketCount[i]!=0) {
					for(int j=0;j<bucketCount[i];j++) {
						a[index]=bucket[i][j];
						index++;
					}
				}
				bucketCount[i]=0;
			}
		}
	}	
}

以上代码仅供参考