合并k个排序的数组-内存问题

时间:2018-11-09 09:56:05

标签: c mergesort

目标是按字母顺序对一维单词矩阵中的单词i x j矩阵进行排序(原始矩阵中的每一行都已排序)。矩阵是从文件中读取的,并存储在三星指针***index中,它是这样动态分配的(在单独的函数中):

char ***index;
index= (char ***) malloc(*row * sizeof(char **));
...
for (int i = 0; i < *row; ++i){

    index[i]= (char **) malloc(*col * sizeof(char **));
    for (int j=0; j<*col; j++) {

        fscanf(fp,"%s",tmp);
        index[i][j]=strdup(tmp);
    }

}

然后我将索引传递给排序函数:char **sort_data(char ***index, int row,int col)

只是以下一种合并排序算法没什么特别的:

  1. 检查***index每行的前几个元素
  2. 将“最小”的单词移至**sortedIndex
  3. 将排序后的单词替换为同一行中的新单词。

    char **sort_data(char ***index, int row,int col){
    
    int i,posInIndex,smallestCharPos,*tracker;
    char **sortedindex,*buffer;
    sortedindex=(char **) malloc((row*col)*sizeof(char*));
    tracker= (int*) calloc(row, sizeof(int));
    
    posInIndex=0;
    while (posInIndex<row*col) {
        smallestCharPos=-1;
        for (i=0; i<row; i++) {
            if ((smallestCharPos==-1)||(strcmp(index[i][tracker[i]], buffer)<0)) {
                smallestCharPos=i;
                buffer=index[i][tracker[i]];
            }
    
        }
        sortedindex[posInIndex]=index[smallestCharPos][tracker[smallestCharPos]];
        posInIndex++;
        tracker[smallestCharPos]++;
    }
    free(tracker);
    return (sortedindex);
    
    }
    

在for循环的某些迭代(取决于矩阵大小)之后,我在EXC_BAD_ACCESS (code=1, address=0x14000001f5)语句中得到了if,这使我相信这是我的内存分配问题,但我无法发现错误。

一个要排序的矩阵的例子是(这个特殊的矩阵在for循环10次迭代后给我带来麻烦):

米兰都灵威尼斯

巴里·热那亚·塔兰托

佛罗伦萨那不勒斯罗马

博洛尼亚卡利亚里·巴勒莫

1 个答案:

答案 0 :(得分:0)

问题在于,您在完成一行操作后不会跟踪。即使您已经用完一行中的所有单词,您也可以继续查看该行,好像还有更多单词要处理。

您需要添加一些代码以跳过已经完全处理的行。

尝试更改此内容:

if ((smallestCharPos==-1)||(strcmp(index[i][tracker[i]], buffer)<0)) {
     ...
}

if (tracker[i] < col)
{
     if ((smallestCharPos==-1)||(strcmp(index[i][tracker[i]], buffer)<0)) {
         ...
     }
}