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

Тема в разделе "MS Visual C++", создана пользователем -, 6 дек 2006.

  1. Гость

    Для определенного количества элементов мой код работает правильно (например, 8). А вот универсальную прогу сделать не получается, скорее не работают последние циклы else. Если нужно могу поподробнее рассказать в чем проблема, если не понятно.
    Код (Text):
    #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:
    Код (Text):
    #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;
    }
     
Загрузка...

Поделиться этой страницей