一.原理
1.1.动态演示图
1.2.动态图讲解
基数排序:创建长度为10的数组,角标对应0-9,对数组位数上的数据对应存放到数组对应的角标上,进行依次存放,直到数组遍历结束。然后按照顺序将数据从数组中取出
放回原数组。在进行位数+1进行对应存放,直至元素组中最大数据的位数。
1.3.数据演示
原始数据:86 4 746 10 60 5 45 85
第一次排序:10 60 4 5 45 85 86 746(按照个位进行排序)
第二次排序:4 5 10 45 746 60 85 86 (按照十位进行排序)
。。。
二.代码实现
public class ArraySortUtils { /** * 返回数组的字符串 * @param array * @return */ public static String arrayToString(int[] array){ StringBuilder sb = new StringBuilder("["); for (int i = 0; i < array.length; i++) { if( i != (array.length - 1)){ sb.append(array[i] + ","); }else{ sb.append(array[i] + "]"); } } return sb.toString(); } /** * 基数排序---使用二维数组进行实现 * @param array */ public static void radixSort(int[] array){ //获取数组中最大值的长度 int MAX = array[0]; for(int i = 1; i < array.length; i++){ if(array[i] > MAX){ MAX = array[i]; } } int length = (MAX + "").length(); //创建一个二维数组,用于存放每次按照位数进行排序的数据 int[][] temp = new int[10][array.length]; //创建一个数组用于记录每一个对应角标存放了多少数据 int[] counts = new int[10]; //进行基数排序 for(int i = 0,n = 1; i < length; i++,n *= 10){ //遍历原数组,将原数组数据放入二维数组 for(int j = 0; j < array.length; j++){ //获取指定位数上的数据值 int baseIndex = array[j]/n%10; //将数组存放到二维数组的指定位置 temp[baseIndex][counts[baseIndex]++] = array[j]; } //创建一个索引,用于记录要添加到元素组的位置 int index = 0; //将二维数组按照顺序放入原数组 for(int j = 0; j < temp.length; j++){ for(int k = 0; k < counts[j]; k++){ array[index++] = temp[j][k]; } } //将counts数组清空 counts = new int[10]; System.out.println("第" + (i+1) + "次排序的结果:" + arrayToString(array)); } } /** * 基数排序---使用队列进行实现 * @param array */ public static void radixSortUseQuene(int[] array){ //获取数组中最大值的长度 int MAX = array[0]; for(int i = 1; i < array.length; i++){ if(array[i] > MAX){ MAX = array[i]; } } int length = (MAX + "").length(); //创建一个大小为10的队列数组 MyQuene<Integer>[] quenes = new MyQuene[10]; for(int i = 0; i < 10; i++){ quenes[i] = new MyQuene<Integer>(); } //进行基数排序 for(int i = 0,n = 1; i < length; i++,n *= 10){ //遍历原数组,将原数组数据放入队列中 for(int j = 0; j < array.length; j++){ //获取指定位数上的数据值 int baseIndex = array[j]/n%10; //将数组队列中 quenes[baseIndex].add(array[j]); } //创建一个索引,用于记录要添加到元素组的位置 int index = 0; //将二维数组按照顺序放入原数组 for(int j = 0; j < quenes.length; j++){ //若队列不为空就出队 while (!quenes[j].isEmpty()){ array[index++] = quenes[j].poll(); } } System.out.println("第" + (i+1) + "次排序的结果:" + arrayToString(array)); } } }
三.演示结果
public class ArraySortUtilsDemo { public static void main(String[] args) { int[] array = new int[]{8,4,7,10,6,5,4,8}; array = new int[]{86,4,746,10,60,5,45,85}; System.out.println("排序前:" + ArraySortUtils.arrayToString(array)); //ArraySortUtils.bubbleSort(array); //ArraySortUtils.quickSort(array); //ArraySortUtils.insertSort(array); //ArraySortUtils.shellSort(array); //ArraySortUtils.selectSort(array); // ArraySortUtils.mergeSort(array); // ArraySortUtils.radixSort(array); ArraySortUtils.radixSortUseQuene(array); System.out.println("排序后:" + ArraySortUtils.arrayToString(array)); } }
排序前:[86,4,746,10,60,5,45,85]
第1次排序的结果:[10,60,4,5,45,85,86,746]
第2次排序的结果:[4,5,10,45,746,60,85,86]
第3次排序的结果:[4,5,10,45,60,85,86,746]
排序后:[4,5,10,45,60,85,86,746]
内容来源于网络如有侵权请私信删除
- 还没有人评论,欢迎说说您的想法!