基數排序:算法
基數排序分爲兩種:第一種是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; } }