读书人

大数据排序c++,该如何处理

发布时间: 2012-02-02 23:57:14 作者: rapoo

大数据排序c++
一个二维数组
char[25000000][40];
要求按第二维的数据中的四十个字符进行排序,
怎么排序最快呢?
c++实现

[解决办法]
(1)若n较小(如n≤50),可采用直接插入或直接选择排序。
当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。
(2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜;
(3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。
快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。这两种排序都是不稳定的。若要求排序稳定,则可选用归并排序。
[解决办法]
快速排序吧
[解决办法]

探讨
还是不会,大家都没说清楚
,那用文件呢
如何把4个0.3G的文件组合成一个新文件
而且要格式和原来的四个一样(有\n)

[解决办法]
这个二维数组是在内存里的吗,如果是的话直接用sort算法就可以了:
C/C++ code
#include <iostream>#include <algorithm>using namespace std;//这个结构的内存布局和char[40]兼容//用于作为sort算法的迭代器struct array_t{    char data[40];};//比较,当然也可以写到array_t里的operator<方法bool arrayless(array_t &a, array_t &b){    return memcmp(a.data,b.data,40) < 0;}int main(int argc, char* argv[]){    //这里演示5组数据,你的25000000好大,不能放在栈里的    char data[5][40]={        "abc",        "123",        "你好~~",        "hello world",        "yun"    };    //转换成array_t*类型(我说过,是兼容的),把pData作为迭代器    array_t *pData = (array_t *)data;    //用sort算法排序,sort使用的就是快速排序算法    std::sort(pData, pData+5, arrayless);    //输出,看看是不是排好序了    for(int i=0; i<5; i++)        cout << data[i] << endl;    return 0;}
[解决办法]
存放不下,你可以分段排序。

1、大文件切割成一小文件,保每小文件可以全部放入存排序。
2、分 File1......FileN 排序,索引,File1......FileN的最大值,最小值,量。找出全部文件的最大最小值。
3、重新分段 File1......FileN ,保持每段最大值最小值不干涉。
4、放入文件中。保每文件均可全部放入存排序,如果文件超大修改最大最小值,放入下一文件中。
5、全部文件重新排序完成, File1......FileN 合成一大文件。

文件排序用std::sort就好了。
(如果可以用,用一句 order by 就行了。)

读书人网 >C++ Builder

热点推荐