数据结构Java版之基数排序(四)
基数排序:
基数排序分为两种:第一种是LSD ,从最低位开始排序, 第二种是 MSD 从最高位开始排。这里介绍第一种LSD排序算法。
首先,我们先了解什么是基数。基数是根据具体的排序情况而定的,比如我们常见的基数是十进制-10,还有二进制-2。
其次,要熟记基数排序的思想:通过对每一个位上的值相排序,就可以完成对整个数组的排序。
基数排序的算法实现流程:遍历所有数组元素,找出元素最大的位值 -------->从低位到高位把数组元素上的位值存入链表中-------->遍历所有链表,将链表里面的值重新赋值给数组,再情况链表。
例如:对数组 int[ ] data = {421, 240, 35, 532, 305, 430, 124};进行排序,首先我们要做的是对个位上的数值进行排序。
第一遍排序的结果为: 240 430 421 532 124 35 305
再进行十位上的数值排序:
第二遍排序的结果为: 305 421 124 430 532 35 240
再进行百位上的数值排序:
第三遍排序的结果为: 35 124 240 305 421 430 532
最后我们的到的排序结果就是: 35 124 240 305 421 430 532
至此,已经完成了对数组的排序
附源码:
public class RadixSort { @Test public void fun() { int[] n = {421, 240, 35, 532, 305, 430, 124}; radixSort(n); for(int i : n) { System.out.print(i + " "); } } //实现基数排序 LSD-从最低位开始排 MSD-从最高位开始排 public void radixSort(int[] data) { int maxBin = maxBin(data); List<List<Integer>> list = new ArrayList<List<Integer>>(); for(int i = 0; i < 10; i ++) { list.add(new ArrayList<Integer>()); } for(int i = 0, factor = 1; i < maxBin; factor *= 10, i ++) { for(int j = 0; j < data.length; j ++) { list.get((data[j]/factor)%10).add(data[j]); } for(int j = 0, k = 0; j < list.size(); j ++) { while(!list.get(j).isEmpty()) { data[k] = list.get(j).get(0); list.get(j).remove(0); k ++; } } } } //计算数组里元素的最大位数 public int maxBin(int[] data) { int maxLen = 0; for(int i = 0; i < data.length; i ++) { int size = Integer.toString(data[i]).length(); maxLen = size > maxLen ? size : maxLen; } return maxLen; } }