如何在几秒中之内给接近百万个10位数排序


此题目并不是一个新鲜事物,而是很常见的需求,试想一下,联通移动的数据量要远远大于我们今天所排序。但是我们平时用的时候基本上是感觉不到卡的,如果只用简单的冒泡法,快排,是万万不可得,这样做效率太慢了。此需求也是我在看完编程珠玑这本书之后,给我了启发,随着不断的调试,写出了最后的源代码。

那么编程珠玑里对这种需求的思想是什么呢,当我们第一次拿到需求的时候,我们第一反应是要把数据从文件中读出来 ,放到内存里,然后在排序。当然了,这是最后最笨的方式了。这么大的数据量我们是不可能把数据全部拿到内存中去的。下面给出源码!

#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的数组元素从数组里打出来。这就是本次的排序的思想。多看几次就能明白里面的猫腻,很有意思!与诸君分享!



猜你喜欢

转载自blog.csdn.net/qq_33324878/article/details/78191675
今日推荐