好程式設計師Java學習路線分享5分鐘瞭解基數排序

好程式設計師IT發表於2019-08-07

  好程式設計師 Java 學習路線分享 5 分鐘瞭解基數排序, 前言: 基數排序無需進行比較和交換,而是利用分配和收集兩種基本操作實現排序。基數排序分為兩種:第一種是 LSD  ,從最低位開始排序;第二種是  MSD , 從最高位開始排序。

基數排序思想介紹

  1. 分配:對於數字,每位的取值範圍是 0-9 ,因此需要 10 個容器(我們可以將其稱為桶),這 10 個桶標號為 0-9 。每趟排序時,我們取每一個元素在該位的數值依次放入桶中。

2.  收集:在一趟排序完成後,我們按順序從 0-9 的桶中依次取元素。

3.  繼續進行分配和收集,直到最大位數排序完成。

演算法說明:

待排序資料: 12, 34, 2, 123, 25, 59, 37

採用 LSD ,從低位開始排序

第一輪:取個位數,放入對應的桶,比如 12 的個位數是 2 ,放到 2 號桶; 34 的個位數是 4 ,放到 4 號桶


第一輪後,得到資料: 12, 2, 123, 34, 25, 37, 59

第二輪:取十位數,放入桶中。比如 2 ,十位數是 ,放到 號桶


第二輪後,得到資料: 2, 12, 123, 25, 34, 37, 59

第三輪:取百位數,放入桶


最後,得到有序資料  2, 12, 25, 34, 37, 59, 123

基數排序的程式碼實現

  1. private   static   void  radixSort( int [] arr) {  
  2. //儲存最大值,暫時記錄為第一個元素  
  3. int  max = arr[0];  
  4. //獲取待排序陣列中的最大值  
  5. for  ( int  v : arr) {  
  6. if  (v > max) {  
  7. max = v;  
  8. }  
  9. }  
  10. // 用列表表示桶,一共10個桶,每個桶對應的元素也是列表  
  11. List<List<Integer>> list =  new  ArrayList<List<Integer>>();  
  12. for ( int  i  = 0; i < 10; i ++) {  
  13. list.add( new  ArrayList<Integer>());  
  14. }  
  15. // 確定迴圈輪數  
  16. for ( int  i = 0, factor = 1; i < max; factor *= 10, i ++) {  
  17. for ( int  j = 0; j < arr.length; j ++) {  
  18. // 根據相應的位(個位/十位...)取通號,然後將資料放入桶中  
  19. list.get((arr[j] / factor) % 10).add(arr[j]);  
  20. }  
  21. // 遍歷桶,將其中資料放入arr陣列中  
  22. for ( int  j = 0, k = 0; j < list.size(); j ++) {  
  23. while (!list.get(j).isEmpty()) {  
  24. arr[k] = list.get(j).get(0);  
  25. list.get(j).remove(0);  
  26. k++;  
  27. }  
  28. }  
  29. }  
  30. }   

 

總結

基數排序是一種按記錄關鍵字的各位值逐步進行排序的方法。一般適用於記錄的關鍵字為整數型別的情況,對於字串和文字排序不適合。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2652971/,如需轉載,請註明出處,否則將追究法律責任。

相關文章