基数排序:算法
基数排序分为两种:第一种是LSD ,从最低位开始排序, 第二种是 MSD 从最高位开始排。这里介绍第一种LSD排序算法。数组
首先,咱们先了解什么是基数。基数是根据具体的排序状况而定的,好比咱们常见的基数是十进制-10,还有二进制-2。spa
其次,要熟记基数排序的思想:经过对每个位上的值相排序,就能够完成对整个数组的排序。code
基数排序的算法实现流程:遍历全部数组元素,找出元素最大的位值 -------->从低位到高位把数组元素上的位值存入链表中-------->遍历全部链表,将链表里面的值从新赋值给数组,再状况链表。blog
例如:对数组 int[ ] data = {421, 240, 35, 532, 305, 430, 124};进行排序,首先咱们要作的是对个位上的数值进行排序。排序
第一遍排序的结果为: 240 430 421 532 124 35 305
rem
再进行十位上的数值排序:get
第二遍排序的结果为: 305 421 124 430 532 35 240源码
再进行百位上的数值排序:class
第三遍排序的结果为: 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; } }