/*
* 基數序 解決不能負數的問題
*/
public static void negative_radix_sortin(int[] str) {
* 基數序 解決不能負數的問題
*/
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];
}
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];
}
}
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();
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 < 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 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;
}
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++;
}
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++;
}
}