Внешняя сортировка

  • Автор темы -
  • Дата начала

Гость
#1
Для определенного количества элементов мой код работает правильно (например, 8). А вот универсальную прогу сделать не получается, скорее не работают последние циклы else. Если нужно могу поподробнее рассказать в чем проблема, если не понятно.
Код:
#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
#include "windows.h"

using namespace std;
const int n=9;
string chtooem(string str)
{
char* buf=new char[str.size()+1];
CharToOem (str.c_str(),buf);
string res(buf);
delete[] buf;
return res;
}
void load(string str){
ifstream in(str.c_str());
if (!in){
cout<<chtooem("Ошибка открытия файла для чтения\n");
return;
}
while (in || !in.fail()){
int v;
if (in>>v)
cout<<v<<" ";
}
in.close();
cout<<"\n";
}
void double_phaza(){
int m=1;
while (m<n){
ifstream ina("A"), inb("B"), inc("C");
ofstream outb("B"), outc("C");
while( ina || !ina.fail())
{
int val;
for (int i=0; i<(n/m); i++){
for (int k=0; k<m; k++)
if (ina>>val)
outb << val << " ";
for (k=0; k<m; k++) 
if (ina>>val)
outc << val << " ";
}
}
ofstream outa2("A");
cout<<endl;
outb.close();
outc.close();
ina.close();
while (!inc.fail() && !inb.fail())
{
int val1, val2;
for (int i=0; i<(n/m); i++){
if (inb>>val1){
if (inc>>val2){
int j=0, k=0;
do {
if (val1<val2){																															  outa2<<val1<<" ";
j++;
f ((j!=m) && (inb>>val1));
}
else {
outa2<<val2<<" ";
k++;
if ((k!=m) && (inc>>val2));
}
} while ((j<m) && (k<m));
if (j==m){
for (int d=k; d<m; d++){																														outa2<<val2<<" ";
if ((d!=m-1) && (inc>>val2));
}
}
if (k==m){
for (int d=j; d<m; d++){
outa2<<val1<<" ";
if ((d!=m-1) && (inb>>val1));
}
}
}
else{
do{
outa2<<val1<<" ";
} while (inb>>val1);
}
}
else{
do{
outa2<<val2<<" ";
} while (inc>>val2);
}
}

}
outa2.close();
inb.close();
inc.close();
load("A");
m*=2;
}
}
void one_phaza(){
}

int main(int argc, char* argv[])
{
ofstream outa("A");	 
int A[]={55, 12, 87, 76, 10, 98, 24, 84, 27};
for (int i=0; i<n; i++)
outa << A[i] << " "; 
outa.close();
load("A");	
double_phaza();
return 0;
}
Дааа.. с форматированием тут че-то туго. Попытка номер 2:
Код:
#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
#include "windows.h"

using namespace std;
const int n=9;
string chtooem(string str)
{
char* buf=new char[str.size()+1];
CharToOem (str.c_str(),buf);
string res(buf);
delete[] buf;
return res;
}
void load(string str){
ifstream in(str.c_str());
if (!in){
cout<<chtooem("Ошибка открытия файла для чтения\n");
return;
}
while (in || !in.fail()){
int v;
if (in>>v)
cout<<v<<" ";
}
in.close();
cout<<"\n";
}
void double_phaza(){
int m=1;
while (m<n){
ifstream ina("A"), inb("B"), inc("C");
ofstream outb("B"), outc("C");
while( ina || !ina.fail())
{
int val;
for (int i=0; i<(n/m); i++){
for (int k=0; k<m; k++)
if (ina>>val)
outb << val << " ";
for (k=0; k<m; k++) 
if (ina>>val)
outc << val << " ";
}
}
ofstream outa2("A");
cout<<endl;
outb.close();
outc.close();
ina.close();
while (!inc.fail() && !inb.fail())
{
int val1, val2;
for (int i=0; i<(n/m); i++){
if (inb>>val1){
if (inc>>val2){
int j=0, k=0;
do {
if (val1<val2){
outa2<<val1<<" ";
j++;
if ((j!=m) && (inb>>val1));
}
else {
outa2<<val2<<" ";
k++;
if ((k!=m) && (inc>>val2));
}
} while ((j<m) && (k<m));
if (j==m){
for (int d=k; d<m; d++){							
outa2<<val2<<" ";
if ((d!=m-1) && (inc>>val2));
}
}
if (k==m){
for (int d=j; d<m; d++){							
outa2<<val1<<" ";
if ((d!=m-1) && (inb>>val1));
}
}
}
else{
do{
outa2<<val1<<" ";
} while (inb>>val1);
}
}
else{
do{
outa2<<val2<<" ";
} while (inc>>val2);
}
}

}
outa2.close();
inb.close();
inc.close();
load("A");
m*=2;
}
}
void one_phaza(){
}

int main(int argc, char* argv[])
{
ofstream outa("A");	 
int A[]={55, 12, 87, 76, 10, 98, 24, 84, 27};
for (int i=0; i<n; i++)
outa << A[i] << " "; 
outa.close();
load("A");	
double_phaza();
return 0;
}