1. 程式人生 > >java排序演算法(九)------基數排序

java排序演算法(九)------基數排序

基數排序

程式碼實現:

public class RadixSort {
	  
    public static void sort(int[] a) {
        int digit = 0;// 陣列的最大位數
        for (int i : a) {
            // 獲取陣列中數的最大位數
            digit = Math.max(digit, String.valueOf(i).length());
        }
        int k = 0;// 使用者記錄排序陣列的索引
        int m = 1;// 當前的位數,個位用1表示,十位用2表示,以此類推
int n = 1;// 用來表示當前位數的整數倍 int type = 10;// 將餘數從0-9分為10種類型 int[][] temp = new int[type][a.length];// 第一維用來儲存餘數,第二維用來儲存餘數對應的陣列值 int[] order = new int[type];// 使用者第二維陣列值得索引計數 while (m <= digit) { // 遍歷陣列中的每個元素,以當前位數依據餘數進行歸類 for (int i = 0; i < a.
length; i++) { int r = (a[i] / n) % 10;// 當前數值在當前位數的餘數 temp[r][order[r]] = a[i];// 第一次為temp[r][0],第二次為temp[r][1]...... order[r]++; } // 遍歷二維陣列的第一維 for (int i = 0; i < type; i++) { if (order[i] != 0) {// 當order[i]==0時,說明order[r]++沒有執行,temp[r][]中沒有儲存陣列值
// 遍歷二維陣列的第二維 for (int j = 0; j < order[i]; j++) {// order[i]表示當前i餘數的型別儲存的陣列值的個數 a[k] = temp[i][j]; k++; } } order[i] = 0; } k = 0;// 排序陣列索引初始化 m++;// 當前位數個數的索引 n *= 10;// 當前位數向前推 } } public static void sort2(int[] arr){ int max = 0; //獲得最大位數 for(int i: arr){ max = Math.max(max, String.valueOf(i).length()); } int type = 10; //臨時陣列 int[][] temp = new int[type][arr.length]; // 第一維用來儲存餘數,第二維用來儲存餘數對應的陣列值 int[]order = new int[type]; // 用第二維陣列值得索引計數 int k = 0; //記錄當前陣列索引 int m = 1; //當前位數整數倍,個位為1,十位為10,百位為100 int n = 1; //// 當前的位數,個位用1表示,十位用2表示,以此類推 while(n <= max){ //裝桶 // 遍歷陣列中的每個元素,以當前位數依據餘數進行歸類 for(int i = 0;i < arr.length;i ++){ int x = arr[i] / m % 10; // 當前數值在當前位數的餘數 temp[x][order[x]] = arr[i]; // 第一次為temp[r][0],第二次為temp[r][1]...... order[x] ++; } //倒桶 for(int i = 0;i < type;i ++){ if(order[i] != 0){ // 當order[i]==0時,說明order[r]++沒有執行,temp[r][]中沒有儲存陣列值 for(int j = 0;j < order[i];j ++){ // order[i]表示當前i餘數的型別儲存的陣列值的個數 arr[k] = temp[i][j]; k++; } order[i] = 0; } } m = m * 10; // 排序陣列索引初始化 k = 0; // 當前位數個數的索引 n ++; // 當前位數向前推 } } }