八大排序-基数排序(七)
-
基数排序原理:不需要进行关键字的比较,只需要对关键字进行“分配”与“收集”即可完成。
-
对数组先去 个位数放入相对应的桶中,放完之后在按桶的索引依次取出来。
- 当个位数放入取出后,再对十位数放入相对应的桶中,放完之后在按桶的索引依次取出来。
- 当十位数放入取出后,再对百位数放入相对应的桶中,放完之后在按桶的索引依次取出来,就完成了基数排序
5.这个总共经历了三次循环,数组中最大有多少位数就进行多少次循环。
6.在数组的过程中,还有一个问题那就是遇到2个或几个相同的数,这里就是遇到了2个98,在编码的过程中怎么解决,我们需要定义一个临时数组。
-
建立一个ArrayDemo5类来完成基数排序
import java.util.Arrays; public class ArrayDemo5 { public static void main(String[] args) { //基数排序:通过分配再收集的方式进行排序 int[] arr={2,1,5,21,31,444,23,33,47,10,903,124,987}; //得确定排序轮次 //获取数组中的最大值 //int max=getMax(arr); //基数排序 sortArry(arr); System.out.println(Arrays.toString(arr)); } private static void sortArry(int[] arr) { //定义二维数组,放10个桶 int[][] tempArr=new int[10][arr.length];//arr.length考虑到arr数组都是个数或都是一样数位的数 //定义统计数组 int[] counts=new int[10]; int max=getMax(arr); int len = String.valueOf(max).length();//确定数组的组大值,也就是确定数组排序的轮次 //循环轮次 for (int i = 0,n=1; i < len; i++,n*=10) { for (int j = 0; j < arr.length; j++) { //获取每个位上的数字 int ys=arr[j]/n%10; tempArr[ys][counts[ys]++]=arr[j]; } //取出桶中的元素 int index=0; for (int k = 0; k < counts.length; k++) { if (counts[k]!=0){ for (int h = 0; h < counts[k]; h++) { //从桶中取出元素放回原数组 arr[index]=tempArr[k][h]; index++; } counts[k]=0;//清除上一次统计的个数 } } } } private static int getMax(int[] arr) { int max=arr[0]; for (int i = 1; i < arr.length; i++) { if (arr[i]>max){ max=arr[i]; } } return max; } }