原题链接:数据结构-基数排序
解题思路:
正整数从小到大的基数排序就是从个位数开始,将待排序数组中的值按照个位数从小到大的顺序进行排序,然后再进行十位数的排序,以此类推,直到数组中的最大值的最高位排序完毕即可。
算法过程如图所示,创建10个容器,遍历待排序数组,个位数为0的值存储在下标为0的容器中,以此类推,将数组中的每一个值都存储在相应下标的容器中,数组遍历完便存储完毕,然后再从下标为0的容器开始依次将容器中的值赋值给数组。然后在十位数上进行类似操作,以此类推,直到数组中的最大值的最高位排序完毕,基数排序完成。
注意事项:
参考代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); //保存待排序数组 int [] num = new int [n]; for ( int i = 0 ; i < num.length; i++) { num[i] = scanner.nextInt(); } //基数排序 radixSort(num); for ( int i = 0 ; i < num.length; i++) { System.out.print(num[i] + " " ); } System.out.println(); scanner.close(); } public static void radixSort( int [] num) { //用max存储待排序数组中最大值 int max = num[ 0 ]; for ( int i = 0 ; i < num.length; i++) { if (max < num[i]) { max = num[i]; } } //maxDight存储最大值有多少位 int maxDigit = String.valueOf(max).length(); //一趟循环比较一位,进行maxDight次循环,第一次循环比较个位,第二次循环比较十位,以此类推 for ( int i = 0 , n = 1 ; i < maxDigit; i++, n= n* 10 ) { //创建bucket存储数据,长度从0~9,bucket[0]存储当前循环比较的位中为0的数,以此类推 ArrayList[] bucket = new ArrayList[ 10 ]; for ( int j = 0 ; j < bucket.length; j++) { bucket[j] = new ArrayList(); } //遍历待排序数组,position为数组的每一个数在当前循环中比较的位上的值 for ( int j = 0 ; j < num.length; j++) { int position = num[j] / n % 10 ; bucket[position].add(num[j]); } int k = 0 ; //将存储在bucket中的值赋值给待排序数组 for (ArrayList arrayList : bucket) { for (Object temp : arrayList) { num[k++] = ( int ) temp; } } //清除bucket中的数据 for (ArrayList arrayList : bucket) { arrayList.clear(); } } } } |
0 分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复