基數排序-java實現
阿新 • • 發佈:2019-01-05
基數排序:
像選擇排序、插入排序、快速排序等都是基於兩個元素的比較進行排序的。而基數排序無需進行元素比較,基於佇列處理就能夠達到排序的目的。
基數排序不是基於排序關鍵字來比較排序項,而是基於排序關鍵字的結構。對於排序關鍵字中的每一個數字或字元的每一種可能取值,都會建立一個單獨的佇列。佇列的數目就稱為基數。
例如:要排序全部由小寫字母組成的字串,則基數就是26,就會用到26個單獨的佇列。如果對十進位制數進行排序,則基數應該是10.
時間複雜度分析:
在基數排序中,沒有任何元素的比較和交換,元素只是在每一輪中從一個佇列移動到另一個佇列。對於給定的基數,遍歷資料的輪次是一個常數,它與排序關鍵字的數目無關,於是,基數排序演算法的時間複雜度為O(n).
為什麼不是所有的排序都使用基數排序演算法呢?
1.基數排序演算法要根據給定問題特別設計;
2.如果排序關鍵字中的數字數目與列表中元素的數目接近,那麼演算法的時間複雜度接近O(n平方);
3.基數影響空間複雜度。
Code:
/* *Created on 2016年7月12日 *Copyright 2016 Yong Cai Limited crop. All Rights Reserved * */ package org.cy.sort; import java.util.LinkedList; import java.util.Queue; public class RadixSort { public static void main(String[] args) { int[] data = {1112,7839,2345,6666,6766,1113,9909,1000}; String tmp; int numObj; int digit,num; Queue<Integer>[] digitQueue = (LinkedList<Integer>[])(new LinkedList[10]); for(int digitVal = 0; digitVal <= 9; digitVal++){ digitQueue[digitVal] = (Queue<Integer>)(new LinkedList<Integer>()); } //sort for(int pos = 0; pos <= 3; pos++){ for(int scan = 0; scan < data.length; scan++){ tmp = String.valueOf(data[scan]); digit = Character.digit(tmp.charAt((3 - pos)), 10); digitQueue[digit].add(new Integer(data[scan])); } num = 0; for(int digitVal = 0; digitVal <= 9; digitVal++){ while(!(digitQueue[digitVal]).isEmpty()){ numObj = digitQueue[digitVal].remove(); data[num] = numObj; num++; } } } for(int scan = 0; scan < data.length; scan++){ System.out.print(data[scan] + " "); } } }
res:
1000 1112 1113 2345 6666 6766 7839 9909