Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中实现这个外部合并排序算法?_C_Sorting_External Sorting - Fatal编程技术网

如何在C中实现这个外部合并排序算法?

如何在C中实现这个外部合并排序算法?,c,sorting,external-sorting,C,Sorting,External Sorting,考虑到机器只有96字节的可用内存,我需要模拟一个外部排序算法。我使用的32字节结构如下所示: typedef struct { char usedmemory[31]; char key; }Register32; void MergeFunction(TypeFile* entry, int lowerindex,int higherindex, TypeFile exitfile){ int i, j, count = 0; } 我已经开始将一个大的to

考虑到机器只有96字节的可用内存,我需要模拟一个外部排序算法。我使用的32字节结构如下所示:

typedef struct {
    char usedmemory[31];
    char key;
}Register32;
void MergeFunction(TypeFile* entry, int lowerindex,int higherindex, TypeFile exitfile){
       int i, j, count = 0;
}  
我已经开始将一个大的tobesorted.txt文件拆分为3个Register32二进制文件。例如:

 I N T E R C A L A C A O B A L A N C E A D A  
被拆分为8个文件,这些文件在内部进行排序,范围从file0.bin到file7.bin,其中包含31个字节的垃圾,1个字节是始终用于对寄存器进行排序的密钥

file0.bin containing INT  
file1.bin containing CER  
file2.bin containing AAL  
file3.bin containing ACO  
file4.bin containing ABL  
file5.bin containing ACN  
file6.bin containing ADE  
file7.bin containing A  
我的任务是在任何给定的时间将其中的2、3或4个文件“合并”到一个退出文件中,并继续合并它们,直到我把最初的单词都整理好。示例:将文件0与文件1合并将输出C E I N R T 在退出文件中。当然,合并功能应该被概括为一次读取每个排序键,并合并到退出文件中,而不管文件输入大小。我的合并函数接收一个文件数组,其中可以包含2、3或4个文件(函数未知)、所述数组的最低索引、较高索引和退出文件。看起来是这样的:

typedef struct {
    char usedmemory[31];
    char key;
}Register32;
void MergeFunction(TypeFile* entry, int lowerindex,int higherindex, TypeFile exitfile){
       int i, j, count = 0;
}  
TypeFile仅是
typedef文件*TypeFile

我知道,如果需要模拟内存结构,我应该一次比较每个寄存器的键,然后将最低值写入exitfile,但我无法让自己想到一种方法来实现这一点。循环约束和输入6个或更多关键字符的情况正在融化我的大脑。最后,我只想对初始的tobesorted.txt文件进行完全排序,一次将2、3或4个文件合并成一个更大的文件,然后继续下一个文件。这已经实现了,我只需要实现Merge函数。
对不起,如果我让自己太难理解,英语不是我的母语。感谢你们提供的任何hep。

如果您已经对原始“块”文件进行了拆分和排序,您需要的是以下内容:

void mergeFiles(FILE* fIn1, FILE* fIn2, FILE* fOut)
{
    int ch1;
    int ch2;
    ch1 = fgetc(fIn1);
    ch2 = fgetc(fIn2);
    // merge files
    while ((ch1 != EOF) && (ch2 != EOF))
    {
        if (ch1 < ch2)
        {
            fputc(ch1, fOut);
            ch1 = fgetc(fIn1);
        }
        else
        {
            fputc(ch2, fOut);
            ch2 = fgetc(fIn2);
        }
    }

    // write the rest of one of the files
    if (ch2 == EOF)
    {
        while (ch1 != EOF)
        {
            fputc(ch1, fOut);
            ch1 = fgetc(fIn1);
        }
    }
    else
    {
        while (ch2 != EOF)
        {
            fputc(ch2, fOut);
            ch2 = fgetc(fIn2);
        }
    }
    fflush(fOut);
}
void合并文件(文件*fIn1、文件*fIn2、文件*fOut)
{
int ch1;
int ch2;
ch1=fgetc(fIn1);
ch2=fgetc(fIn2);
//合并文件
而((ch1!=EOF)&(ch2!=EOF))
{
如果(ch1

其思想是,合并排序算法的合并阶段只需要获得合并的两个子数组中每个子数组的第一个元素。因此,流输入(如文件)也符合这一要求(即,您不必将整个文件读入RAM!)。您所要做的只是逐字符读取两个已排序的文件,比较这些字符,然后输出到目标文件,以较小者为准。然后再次合并这些新的组合文件,直到得到一个大的排序文件。

96字节。点燃。。您将分配多少堆栈空间?由于有96个字节,您无法运行我所知道的任何文件系统。即使是FAT-12也需要512字节的目录缓冲区。@thingywot我认为96字节的限制在系统内存上,而不是磁盘上。这意味着排序程序不应使用超过96个字节。我可能错了。那么前31个字节到底用了没有?你似乎在说它们不是排序键的一部分,也不是输出的一部分,那么为什么要读取它们呢?@没用,这只是任务的一部分。我们需要比较包含内容的内容,以便看到不同排序方法之间的差异。你真的比较了这些数据吗?2.你真的输出了这些数据吗?如果两个答案都是“否”,那么作业是否要求你将它们读入记忆?