1、動圖演java
2、思路分析數組
基數排序第i趟將待排數組裏的每一個數的i位數放到tempj(j=1-10)隊列中,而後再從這十個隊列中取出數據,從新放到原數組裏,直到i大於待排數的最大位數。spa
1.數組裏的數最大位數是n位,就須要排n趟,例如數組裏最大的數是3位數,則須要排3趟。3d
2.若數組裏共有m個數,則須要十個長度爲m的數組tempj(j=0-9)用來暫存i位上數爲j的數,例如,第1趟,各位數爲0的會被分配到temp0數組裏,各位數爲1的會被分配到temp1數組裏......code
3.分配結束後,再依次從tempj數組中取出數據,遵循先進先進原則,例如對數組{1,11,2,44,4},進行第1趟分配後,temp1={1,11},temp2={2},temp4={44,4},依次取出元素後{1,11,2,44,4},第一趟結束blog
4.循環到n趟後結束,排序完成排序
根據思路分析,每一趟的執行流程以下圖所示:隊列
經過基數排序對數組{53, 3, 542, 748, 14, 214, 154, 63, 616}:內存
3、負雜度分析class
1. 時間複雜度:
每一次關鍵字的桶分配都須要O(n)的時間複雜度,並且分配以後獲得新的關鍵字序列又須要O(n)的時間複雜度。
假如待排數據能夠分爲d個關鍵字,則基數排序的時間複雜度將是O(d*2n) ,固然d要遠遠小於n,所以基本上仍是線性級別的。
係數2能夠省略,且不管數組是否有序,都須要從個位排到最大位數,因此時間複雜度始終爲O(d*n) 。其中,n是數組長度,d是最大位數。
2. 空間複雜度:
基數排序的空間複雜度爲O(n+k),其中k爲桶的數量,須要分配n個數。
4、Java 代碼以下
import java.util.Arrays; public class Main { public static void main(String[] args) { int[] arr = new int[]{10,6,3,8,33,27,66,9,7,88}; radixSort(arr); } private static void radixSort(int[] arr) { //求出待排數的最大數
int maxLength=0; for (int i = 0; i < arr.length; i++) { if(maxLength<arr[i]) maxLength = arr[i]; } //根據最大數求最大長度
maxLength = (maxLength+"").length(); //用於暫存數據的數組
int[][] temp = new int[10][arr.length]; //用於記錄temp數組中每一個桶內存的數據的數量
int[] counts = new int[10]; //用於記錄每一個數的i位數
int num = 0; //用於取的元素須要放的位置
int index = 0; //根據最大長度決定排序的次數
for (int i = 0,n=1; i < maxLength; i++,n*=10) { for (int j = 0; j < arr.length; j++) { num = arr[j]/n%10; temp[num][counts[num]] = arr[j]; counts[num]++; } //從temp中取元素從新放到arr數組中
for (int j = 0; j < counts.length; j++) { for (int j2 = 0; j2 < counts[j]; j2++) { arr[index] = temp[j][j2]; index++; } counts[j]=0; } index=0; } System.out.println(Arrays.toString(arr)); } }