我需要以下计数排序实现的帮助。是因为x的值太大了吗?我得到分割错误。这是gdb说的:
Program received signal SIGSEGV, Segmentation fault.
___chkstk_ms () at /usr/src/debug/gcc-5.4.0- 1/libgcc/config/i386/cygwin.S:146
146 /usr/src/debug/gcc-5.4.0-1/libgcc/config/i386/cygwin.S: No such file or directory.
这里是代码片段,
void radix_sort::sort_array(int array[], int n)
{
int arrayB[n];
auto k = *std::max_element(&array[0], &array[n - 1]);
auto m = *std::min_element(&array[0], &array[n - 1]);
long int x = k - m + 1;
int arrayC[x];
for (auto i = 0; i < n; i++)
arrayC[array[i] - m]++;
for (long int i = 1; i < x; i++)
arrayC[i] = arrayC[i] + arrayC[i - 1];
for (auto i = n - 1; i >= 0; i--)
{
arrayB[arrayC[array[i] - m] - 1] = array[i];
arrayC[array[i] - m]--;
}
for (int i = 0; i < n; i++)
array[i] = arrayB[i];
}
In
arrayC[array[i] - m]++;
在代码的这一点上,没有arrayC
的元素被分配,所以一个未知的数字被增加。这可能会爆炸
arrayB[arrayC[array[i] - m] - 1] = array[i];
后几行,因为arrayC[array[i] - m]
可能是负的或几十亿,并且超出了我们所知道的范围
数组的声明
int arrayB[n];
int arrayC[x];
声明可变长度数组。变量长度数组不是标准的c++特性。你需要动态分配内存,而不是声明可变长度数组。
标准算法的调用
auto k = *std::max_element(&array[0], &array[n - 1]);
auto m = *std::min_element(&array[0], &array[n - 1]);
忽略数组array
的最后一个元素。相反,你需要写
auto k = *std::max_element( array, array + n );
auto m = *std::min_element( array, array + n );
数组arrayC
未初始化。
int arrayC[x];
那么这个语句
arrayC[array[i] - m]++;
调用未定义行为。
注意,在函数内,您需要检查n
大于0
。
函数可以按照以下方式声明和定义:
void radix_sort::sort_array( int a[], size_t n )
{
if (n)
{
auto minmax = std::minmax_element( a, a + n );
auto min = *minmax.first, max = *minmax.second;
size_t k = max - min + 1;
auto p = std::make_unique<int[]>( k );
for (size_t i = 0; i < n; i++)
{
++p[a[i] - min];
}
std::partial_sum( p.get(), p.get() + k, p.get() );
auto b = std::make_unique<int[]>( n );
for (size_t i = n; i-- != 0; )
{
b[--p[a[i] - min]] = a[i];
}
std::copy( b.get(), b.get() + n, a );
}
}