我试图对“随机”整数数组进行基数排序。 radix_sort函数给出了seg错误。我检查了每个for循环,它们似乎都没有超出范围所以我的假设是问题可能是数组指针,但我似乎无法在网上找到任何有助于解决任何此类问题的任何源信息。 用GCC编译,带-std = c99标志
#include <stdio.h>
#include <stdlib.h>
#define LEN 1000
#define BYTES 4
#define BINS 256
void create_lst();
void int_radix_sort();
void radix_sort(int);
long data[LEN];
long temp[LEN];
int main(int argc, char * * argv) {
create_lst();
int_radix_sort();
return 0;
}
void create_lst() {
for (int i = 0; i < LEN; i++) {
srand(rand());
data[i] = rand();
}
return;
}
void int_radix_sort() {
for (int i = 0; i < BYTES; i++) {
radix_sort(i);
}
return;
}
void radix_sort(int byte) {
long map[BINS], count[BINS];
long *src_p, *dst_p;
if((byte%2) == 0){
src_p = data;
dst_p = temp;
} else {
src_p = temp;
dst_p = data;
}
// Count
for(int i = 0; i < LEN; i++)
count[(src_p[i] >> (byte*8)) & (BINS-1)]++;
// Map
map[0]=0;
for(int j = 1; j < BINS; j++)
map[j] = count[j-1] + count[j-1];
// Move
for(int k = 0; k < LEN; k++)
dst_p[map[(src_p[k] >> (byte*8)) & (BINS-1)]++] = src_p[k];
return;
}
编辑:更多信息 - 当我通过调试器运行程序时,我发现问题出现在最后一个循环中(使用K变量)
答案 0 :(得分:3)
count
中的radix_sort
数组未初始化,其值用于在map
中创建值,最后(参见// Move
)用于索引{ {1}}然后是BOOM。
在您修复初始化后,您最终会在dst_p
中使用1954
,这对于map[1]
来说太大了,所以现在您正在查看算法问题。尝试添加一些跟踪打印语句来解决您的问题。或者进入调试器(Linux上为dst_p
)并逐步执行程序以验证所有步骤是否符合预期。
答案 1 :(得分:1)
for(int j = 1; j < BINS; j++)
map[j] = count[j-1] + count[j-1];
错了。您希望map[j]
保留前一个插槽中的累积元素数,因此应该
for(int j = 1; j < BINS; j++)
map[j] = map[j-1] + count[j-1];
// ^^^
// add the number of items in bin j-1 to the number of items in previous bins