Java實現基數排序(解決負數也可以排序)


/*
  * 基數序 解決不能負數的問題
  */
 public static void negative_radix_sortin(int[] str) {
  // 桶 10個桶 每個桶的最大容量默認為數組長度
  int[][] bucket = new int[10][str.length];
  // 每個桶的當前容量
  int[] capacity = new int[10];
  // 注意:正數負數共用10個桶 不要再重新定義 節約內存 因為每次都有清理空
  int negative_number = 0;// 記錄負數個數
  int positive_number = 0;// 記錄正數個數
  int[] negative_arr = new int[str.length];// 存放負數
  int[] positive_arr = new int[str.length];// 存放正數
  // 記錄正數最大值 和負數最小值 用於記錄長度
  int max = positive_arr[0];
  int min = negative_arr[0];
  // 先把原數組分成一個負數數組 和一個正數數組 並找出正數最大值
  for (int a = 0; a < str.length; a++) {
   if (str[a] < 0) {
    negative_arr[negative_number] = str[a];
    negative_number += 1;
   } else {
    positive_arr[positive_number] = str[a];
    positive_number += 1;
   }
   // 找出正數最大值
   if (str[a] > max) {
    max = str[a];
   }
  }
  // 把負數數組變成正數數組 再找出最大值
  for (int r = 0; r < negative_number; r++) {
   negative_arr[r] = negative_arr[r] / (-1);
   // 此時的負數數組已經是正數
   if (negative_arr[r] > min) {
    min = negative_arr[r];
   }
  }
  // 求出最大長度 用於判斷循環幾大輪
  int max_length = (max + "").length();
  int min_length = (min + "").length();
  // 先排序正數
  for (int b = 0, u = 1; b < positive_number; b++, u *= 10) {
   for (int i = 0; i < positive_number; i++) {
    int base = positive_arr[i] / u % 10; // 比如基數為 4
    // 將基數按照規則放進桶中
    bucket[base][capacity[base]] = positive_arr[i]; // 放進第四個桶中 的第一幾個當前容量位置
    capacity[base]++; // 容量增加
   }
   // 取出數據
   int d = 0;
   for (int k = 0; k < capacity.length; k++) {
    if (capacity[k] != 0) {
     for (int p = 0; p < capacity[k]; p++) {
      positive_arr[d] = bucket[k][p];
      d++;
     }
    }
    // 注意:清零
    capacity[k] = 0;
   }
  }
  // 排序負數數組 正數差不多 注意最后取出數據的時候 才大到小 不再是從小到大
  for (int b = 0, u = 1; b < negative_number; b++, u *= 10) {
   for (int i = 0; i < negative_number; i++) {
    int base = negative_arr[i] / u % 10;
    bucket[base][capacity[base]] = negative_arr[i]; // 放進第四個桶中 的第一幾個當前容量位置
    capacity[base]++;
   }
   int d = 0;
   for (int k = capacity.length - 1; k >= 0; k--) {
    if (capacity[k] != 0) {
     for (int p = 0; p < capacity[k]; p++) {
      negative_arr[d] = bucket[k][p];
      d++;
     }
    }
    // 注意:清零
    capacity[k] = 0;
   }
  }
  // 把負數數組轉化成負數 覆蓋給原來的數組(從0開始)
  int c = 0;
  for (int e = 0; e < negative_number; e++) {
   str[c] = negative_arr[e] / (-1);
   c++;
  }
  // 正數接上原來數組
  for (int t = 0; t < positive_number; t++) {
   str[c] = positive_arr[t];
   c++;
  }
 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM