標籤:java 基數排序
詳細講解見《2015版資料結構高分筆記》8.6節——基數排序。
Java代碼如下:
package linetimesort;import java.util.LinkedList;import java.util.Objects;/** * 基數排序的思想是多關鍵字排序 * @author yuncong * */public class RadixSort {/** * 基於最低位優先方式對一個整型數組排序,數組中整數是d位元; * 以3位整數排序為例,基於最低位優先方式排序的步驟是:建立十個隊列,用於臨時儲存整數; * 首先按個位排序,按照每個整數的個位元字把整數放進相應隊列,比如120放進第0個隊列, * 124放進第4個隊列,當把所有整數都放進相應隊列後,依次從第零個隊列到第9個隊列收集整數, * 收集得到的所有整數按照個位元大小從小到大排序了; * 然後按十位元排序,以同樣的方式把每個整數按十位元放進相應隊列,對於十位元相同的整數, * 個位元小的整數先放進隊列,因為上一步按個位元的排序導致個位元小的數在前面,接下來, * 依次從第零個隊列到第9個隊列收集整數,整體上先收集十位元小的數,局部到具體隊列中, * 也就是十位元相同的那些數,按照隊列先進先出的特性,個位元小的數先被收集,於是,收集 * 得到的所有整數是按照十位和個位組合後的大小從小到大排列的; * 最後按百位元排序,以同樣的方式把每個整數按百位元放進相應隊列,對於百位元相同的整數, * 十位元和個位元組合後小的整數先被放進隊列,因為上一步的排序導致十位元和個位元組合後小 * 的整數在前面,接下來,依次從第零個隊列到第9個隊列收集整數,整體上,先收集百位元小 * 的數,局部到具體隊列中,也就是百位元相同的那些數,按照隊列的先進先出特性,十位元和 * 個位元組合後小的整數先被收集,於是,收集得到的所有整數按從小到大排列。 * 一句話總結排序過程,整體上從小到大,局部上也是從小到大。 * @param integers 待排序整數數組 * @param d 待排序數組中整數的位元 */public void sort(Integer[] integers, int d) {/** * 建立隊列集合并初始化,集合中的隊列用於存放相應的元素,比如按最低為排序,234應該 * 放在queues.get(4)這個隊列中 */LinkedList<LinkedList<Integer>> queues = new LinkedList<>();for(int i = 0; i < 10; i++){LinkedList<Integer> queue = new LinkedList<>();queues.add(queue);}for(int i = d - 1; i >= 0; i--) {// 根據排序key,把元素放進相應的隊列裡for (int j = 0; j < integers.length; j++) {Integer key = getValueByIndex(integers[j], i);queues.get(key).add(integers[j]);}/** * 把元素收回來; * for迴圈從頭到尾便利集合 */int index = 0;for (LinkedList<Integer> linkedList : queues) {for (Integer integer : linkedList) {integers[index] = integer;index++;}// 清空queues裡的所有隊列,為二次利用做準備linkedList.clear();}}}/** * 獲得integer中第index + 1個數字 * @param integer * @param index * @return */public Integer getValueByIndex(Integer integer, int index) {Objects.requireNonNull(integer);String iString = integer.toString();if (index < 0 || index >= iString.length()) {throw new IndexOutOfBoundsException();}String value = iString.substring(index, index + 1);return Integer.valueOf(value);}public static void main(String[] args) {Integer[] integers = new Integer[]{654, 122, 987, 123, 345, 234};new RadixSort().sort(integers, 3);for (int i = 0; i < integers.length; i++) {System.out.println(integers[i]);}}}
Java實現基數排序