八大排序算法——基數排序(動圖演示 思路分析 實例代碼java 複雜度分析)

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)); } }
相關文章
相關標籤/搜索