07.01.2011, 15:09
общий
это ответ
Здравствуйте, Посетитель - 356874!
Вот примерная реализация метода внешней сортировки простым слиянием. Тестировалась под VS 2008.
Приложение:
#include <iostream>
#include <fstream>
using namespace std;
const int N = 16;
void sliyanie(int k)
// функция слияния,
// k-количество элементов в упорядоченном блоке
{
int m, n;
ofstream a("A.txt");
ifstream b("B.txt");
ifstream c("C.txt");
b >> m;
c >> n;
while (!b.eof())
{
int i=0, j=0;
while ((i<k)&&(j<k))
{
if (m<=n) { a << m; b >> m; i++;}
else {a << n; c >> n; j++;}
a << "\n";
};
while (i<k) {a << m; if (!b.eof()) a << "\n"; b >> m; i++;};
while (j<k) {a << n; if (!c.eof()) a << "\n"; c >> n; j++;};
};
if (k==1)
if (m<=n) a << m << "\n" << n;
else a << n << "\n" << m;
a.close();
b.close();
c.close();
}
void sort(int k)
// функция сортировки
{
ifstream a("A.txt");
ofstream b("B.txt");
ofstream c("C.txt");
// разбиение основного файла на упорядоченные блоки
while (!a.eof())
{
int m;
a >> m;
b << m;
for (int i=1; i<k; i++)
{
a >> m;
b << "\n" << m;
};
a >> m;
c << m;
for (int i=1; i<k; i++)
{
a >> m;
c << "\n" << m;
};
if (!a.eof()) {b << "\n"; c << "\n";};
};
a.close();
b.close();
c.close();
sliyanie(k);
}
int main() {
// поддержка кириллицы
setlocale(LC_CTYPE, "Russian");
// Вводим произвольные данные в файл
ofstream a("A.txt");
for (int i=0; i<N-1; i++)
a << rand()%100 << "\n";
a << rand()%100;
a.close();
for (int i=1; i<=(N/2); i*=2)
sort(i);
// ожидание нажатия любой клавиши
system("PAUSE");
return 0;
}