によって乱数の生成ソートリストは、標準ライブラリには、マージソートがありますが、ランダムアクセスイテレータを使用する必要があります。
#include <algorithm>
#include <cstdio>
#include <random>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
const size_t COUNT = 4096 * 4096;
int main()
{
// create file (using mmap for simplicity)
int fd = open("out.dat", O_RDWR | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR);
if (fd < 0) {
std::perror("open failed");
return 1;
}
if (ftruncate(fd, COUNT * sizeof(unsigned)) != 0) {
std::perror("ftruncate failed");
close(fd);
return 1;
}
void* mm = mmap(nullptr, COUNT * sizeof(unsigned), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (mm == MAP_FAILED) {
std::perror("mmap failed");
close(fd);
return 1;
}
close(fd);
// populate file
unsigned* begin = static_cast<unsigned*>(mm);
std::default_random_engine rng((std::random_device())());
std::generate_n(begin, COUNT, rng);
msync(mm, COUNT * sizeof(unsigned), MS_SYNC);
std::puts("file written");
// sort file
std::stable_sort(begin, begin + COUNT);
msync(mm, COUNT * sizeof(unsigned), MS_SYNC);
std::puts("file sorted");
if (std::is_sorted(begin, begin + COUNT)) {
std::puts("it's properly sorted");
}
// close file
munmap(mm, COUNT * sizeof(unsigned));
return 0;
}
msync
通話が実際に必要されていません:あなたはmmap
(またはそれに相当)を使用することができます場合は、(はい、私はあなたがコマンドラインからCOUNT
を取る必要があることを知っている)、ランダムアクセスイテレータを持っています。私は正直言って、これはまともなパフォーマンスを持っていることに驚いています。
メインメモリとはどういう意味ですか? –
配列にその数値を挿入して、挿入ソートやバブルソートなどのアルゴリズムでソートするべきではありません。 –
お探しのものは* External Merge Sort *と呼ばれており、これを達成する方法については多くの情報があります。彼らはすべて、私はあなたがやりたいとは思わないN個のファイルを作る必要がありますいくつかのサイズのバッファを使用することに注意してください。 – NathanOliver