那么编程珠玑里对这种需求的思想是什么呢,当我们第一次拿到需求的时候,我们第一反应是要把数据从文件中读出来 ,放到内存里,然后在排序。当然了,这是最后最笨的方式了。这么大的数据量我们是不可能把数据全部拿到内存中去的。下面给出源码!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char * argv[]) {
FILE *fd= fopen("/Users/yong/Downloads/buffer.txt","rb");
char *ch = (char*)malloc(10000000);
while (!feof(fd))
{
char a[10];
char buffer[10];
size_t size=fread(a, sizeof(a), 1, fd);
strncpy(buffer, a, 8);
ch[atoi(buffer)-10000000]=1;
}
printf("sort done\n");
FILE*fp= fopen("/Users/yong/Downloads/write.txt","wb");
for (long i=0;i<10000000;i++) {
if(ch[i]==1)
{
char a[10];
sprintf(a, "%ld\n", i+10000000);
fwrite(a, sizeof(a), 1, fp);
}
}
free(ch);
fclose(fp);
}
本次排序的思想是什么呢?,可以看出只有这么几行代码,大家拷贝下来可以试试运行一下 ,运行时间就只有2秒多。博客不能传文件好像,但是我看看能不能以图片形式传上去。思想就是,我在堆区创建一个1000000的空间。由于我要排序的文件里的数字都以1开头,所以可以先把1去掉。排序之后再加上。我每次从文件里读出一行的数据,我以char a[10]来存储。大家想一想,这些数字是不是可以作为我们在堆区数组的标号呢?,所以我们在每读出一个数据就把我们在堆区数组的相应元素个数上标1,都读完之后。我们把标1的数组元素从数组里打出来。这就是本次的排序的思想。多看几次就能明白里面的猫腻,很有意思!与诸君分享!