我试图在C 中实现外部排序。
我必须首先从文件中读取N个整数(根据主存储器修复),以便我可以对它们应用快速排序,然后继续合并过程。
我可以想到这两种方式:
第一种方法显然很慢,第二种方法使用了大量的额外内存(但我们的内存有限)
还有更好的方法吗?
答案 0 :(得分:3)
不要试图比你的操作系统更聪明,它可能支持一些聪明的内存管理功能,这将使你的生活更轻松,你的代码更快。
假设您使用的是兼容POSIX的操作系统,则可以使用mmap(2)。
这样,当房间紧张时,操作系统将处理数据交换,并在您需要时将其交换。
答案 1 :(得分:1)
您可以使用以下功能逐一从文件中读取内容并继续排序和合并....
该函数将filename和integer count作为参数,并从文件中返回int。
int read_int (const char *file_name, int count)
{
int err = -1;
int num = 0;
int fd = open(filename, O_RDONLY);
if(fd < 0)
{
printf("error opening file\n");
return (fd);
}
err = pread(fd, &num, sizeof(int), count*sizeof(int));
if(err < 0)
{
printf("End of file reached\n");
return (err);
}
close(fd);
return (num);
}
答案 2 :(得分:1)
由于缓存了stdio
个文件操作,因此您不必担心第一个选项,特别是如果文件不是很大的话。请记住,您不是直接在文件上操作,而是在内存中表示该文件。
例如,如果您一次扫描一个数字,系统将从文件中读取更大的部分(在我的系统上读取4096字节,或者整个文件,如果它是#s;短)。
答案 3 :(得分:0)
在您阅读的同时排序是最好的方法。并将数据保存到链表而不是数组在排序中更有效
您可以使用fscanf()
从文件中读取整数整数。并在您从文件中读取整数时尝试排序。我的意思是当你从文件中读取整数时将它放在正确的数组中,以便在你完成阅读时对数组进行排序。
以下示例从整数读取整数文件,并在读取的同时插入排序。整数保存到数组中而不是保存到链表
中void sort_insert(int x, int *array, int len)
{
int i=0, j;
for(i=0; i<(len-1); i++)
{
if (x > array[i])
continue;
for (j=(len-1); j>i; j--)
array[j] = array[j-1];
break;
}
array[i] = x;
}
void main() {
int x, i;
int len = 0;
int array[50];
FILE *fp = fopen("myfile.txt", "r");
while (len<50 && fscanf(fp, " %d",&x)>0)
{
len++;
sort_insert(x, array, len);
}
for (i=0; i<len; i++)
{
printf("array[%d] = %d\n", i, array[i]);
}
}