我正在尝试通过将数字分成8个但对数字进行排序来进行基数排序。这是我到目前为止编写的代码。我陷入了细分错误,我不确定为什么。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
// #include <omp.h>
#include "sort.h"
#include "edgelist.h"
void radixSortEdgesBySource(struct Edge *edges_sorted, struct Edge *edges, int numVertices, int numEdges) {
int i,j;
int *vertex_cnt = (int *) malloc (256 * sizeof(int));
for (j = 0; j < 4; ++j) //Radix Sort for d digits
{
//int *vertex_cnt = (int *) malloc ((1<<8) * sizeof(int));
for(i = 0; i < 256; ++i)
{
vertex_cnt[i] = 0;
}
for(i = 0; i < numEdges; ++i)
{
vertex_cnt[(edges[i].src >> 8*j) & ((1 << 8) - 1)]++;
}
for(i = 1; i < 257; ++i)
{
vertex_cnt[i] += vertex_cnt[i - 1];
}
for(i = numEdges - 1; i >= 0; --i) {
//printf("KEY: %d\n", (edges[i].src >> 8*j) & ((1 << 8) - 1));
edges_sorted[--vertex_cnt[(edges[i].src >> 8*j) & ((1 << 8) - 1)]] = edges[i];
}
edges = edges_sorted;
//free(vertex_cnt);
}
// free(vertex_cnt);
}
值edges
和edges_sorted
定义为:
struct Edge{
int src; // id of a source vertex
int dest; // id of a destination vertex
};
struct Edge * newEdgeArray(int numOfEdges);
有人可以帮我解决为什么出现细分错误吗?
答案 0 :(得分:1)
您为256个元素分配内存:
int *vertex_cnt = (int *) malloc (256 * sizeof(int));
,但是然后迭代数组,就好像它有257个元素一样:
for(i = 1; i < 257; ++i)
我强烈建议学习使用Valgrind。您将能够找到发生内存访问错误的确切行。