【发布时间】:2017-09-05 15:12:22
【问题描述】:
我需要编写一个程序,生成 N 个随机数并按降序将它们写入二进制文件。它应该在不使用任何使用主内存的排序算法的情况下完成。这是我到目前为止所做的:
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main () {
srand(time(0));
rand();
int N;
do{
cout << "Unesite N: ";
cin >> N;
} while(N<=0);
ofstream br("broj.dat", ios::binary | ios::trunc);
for(int i = 0; i<N; i++){
int a = rand();
br.write((char *)&a, sizeof(a));
}
br.close();
return 0;
}
所以,我生成了随机数并将它们写入二进制文件,但我不知道如何对其进行排序。
【问题讨论】:
-
您要查找的内容称为外部合并排序,那里有很多关于如何完成此任务的信息。请注意,它们都使用一定大小的缓冲区,否则您需要制作 N 个文件,而我认为您不想这样做。
-
在 SO stackoverflow.com/questions/20802396/…... 上找到了一些关于外部排序的信息...并且接受的答案提供的链接是一个好的开始
-
@KrisBob 我认为你将要学习关于拖延的教训。编程不是在最后一刻完成的,调试时间总是你想象的两倍。至少。
-
@NathanOliver 缓冲区减少了通过,但很容易编写一个没有缓冲区且从不需要超过
O(log(n))个文件的外部合并排序。诀窍是维护一堆文件。将 2 个元素写入文件,然后递归合并堆栈,直到文件大小不同。继续这样做,然后在最后递归合并堆栈。 -
这可能是考虑排序后那些
N数字之间差异分布的时候了。接下来,假设一个虚拟元素std::numeric_limits<int>::max(),从合适的源中提取差异,从先前的减去,输出并重复。 (如果到std::numeric_limits<int>::min()太快,需要调整来源。)(这样就完成了第一句的要求,与标题中的external sort没有任何关系。)
标签: c++ algorithm sorting random binaryfiles