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