获取 radix/counting 排序以处理负数
Getting radix/counting sort to work with negative numbers
我正在学习编程,如果我遗漏了一些明显的东西,请原谅。
我有一个基本的 LSD 基数排序和计数排序对。
我将如何将其转换为使用负数?
这种计数排序方式可行吗?还是我需要另一种方式?
void radixsort(int arr[], int n) {
int m = getMaxElement(arr, n);//Find the maximum number in array.
for (int exp = 1; m/exp > 0; exp *= 10)
CountSort(arr, n, exp);
}
void CountSort(int arr[], int n, int exp) {
int output[n];
int i, c[10] = {0}; // store the number of times in c[]
for (i = 0; i < n; i++)
c[ (arr[i]/exp)%10 ]++;
for (i = 1; i < 10; i++)
c[i] +=c[i - 1];
// Making the output array
for (i = n - 1; i >= 0; i--) {
output[count[ (arr[i]/exp)%10 ] - 1] = arr[i];
c[ (arr[i]/exp)%10 ]--;
}
for (i = 0; i < n; i++)
arr[i] = output[i];
}
您可以将符号视为一个单独的数字,最重要的数字。所以你的最后一次传球只有两个桶——负数和非负数。
你需要做的不同的一件事是将负数桶中的数字以相反的顺序移动到最终数组(因为之前的传递忽略符号,所以负数按其绝对值排序,这意味着以相反的顺序)。
我正在学习编程,如果我遗漏了一些明显的东西,请原谅。 我有一个基本的 LSD 基数排序和计数排序对。 我将如何将其转换为使用负数? 这种计数排序方式可行吗?还是我需要另一种方式?
void radixsort(int arr[], int n) {
int m = getMaxElement(arr, n);//Find the maximum number in array.
for (int exp = 1; m/exp > 0; exp *= 10)
CountSort(arr, n, exp);
}
void CountSort(int arr[], int n, int exp) {
int output[n];
int i, c[10] = {0}; // store the number of times in c[]
for (i = 0; i < n; i++)
c[ (arr[i]/exp)%10 ]++;
for (i = 1; i < 10; i++)
c[i] +=c[i - 1];
// Making the output array
for (i = n - 1; i >= 0; i--) {
output[count[ (arr[i]/exp)%10 ] - 1] = arr[i];
c[ (arr[i]/exp)%10 ]--;
}
for (i = 0; i < n; i++)
arr[i] = output[i];
}
您可以将符号视为一个单独的数字,最重要的数字。所以你的最后一次传球只有两个桶——负数和非负数。
你需要做的不同的一件事是将负数桶中的数字以相反的顺序移动到最终数组(因为之前的传递忽略符号,所以负数按其绝对值排序,这意味着以相反的顺序)。