Консультация № 181765
06.01.2011, 07:58
0.00 руб.
0 7 1
Здравствуйте, уважаемые эксперты!
Очень нужна помощь со следующей задачей: реализовать алгоритм внешней сортировки простым слияниям.
Спасибо!

Обсуждение

давно
Мастер-Эксперт
325460
1469
06.01.2011, 12:25
общий
естественное слияниеэто не то

еще Сортировка слиянием
Об авторе:
to live is to die
Неизвестный
06.01.2011, 22:11
общий
Спасибо за ссылки. Прочитала теорию.
Помогите, пожалуйста, написать программу.
Неизвестный
06.01.2011, 22:58
общий
Что конкретно надо сортировать этим методом? Не могли бы Вы подробнее описать задачу. Кстати в первой ссылки которую Вам дали выше как раз подробно описана реализация данного метода.
Неизвестный
06.01.2011, 23:27
общий
Cортировать файлы алгоритмом внешней сортировки методом простого слияния. Как я поняла для работы нужно всего 3 файла. 1 исходный и 2 вспомогательных. Поделить по некоторому правилу на вспомогательные файлы, потом слить назад в исходный. Опять поделить, снова слить в исходный.
Буду благодарна любой помощи!
Неизвестный
06.01.2011, 23:40
общий
Какие данные находятся в исходном файле?
Неизвестный
06.01.2011, 23:44
общий
думаю это не принципиально будет. можно брать любые.
Неизвестный
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;
}
5
Спасибо за помощь!
Форма ответа