Matrix mergesort代码

时间:2016-04-04 11:25:31

标签: c++

我对此代码有疑问,我无法解决它。问题是它只是对递归函数进行了一次迭代,并且它们会引发分段错误。

我正在研究的问题是:我有K个有序向量,我想在一个mergedort向量中合并它们。我的实现将所有向量推送到一个矩阵中并递归排序。该函数是mergeKvectors。

这是代码:

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <climits>
#include <cassert>
#include <string>
#include <fstream>
#include <vector>

using namespace std;


class matrix
{
public:
    matrix(int filas, int columnas)
    {
        datos.resize(filas);
        for(int i = 0; i< filas; i++)
        {
            datos[i].resize(columnas);
        }
    }
    vector< vector<int> > datos;
    /*
 *
 * @brief Función para sobrecargar el operados == para dos vectores 
 * @param vectores : matriz en que cada fila corresponde a un vector 
 *                   ordenado
 * @return resultAux : vector ordenado a partir 
 */

matrix& operator=( const matrix  v2)
{
    matrix& m= *this;
    for (int i = 0; i < this->datos.size(); i++){
        for (int j = 0; j< this->datos.at(0).size();j++){
            this->datos[i][j] = v2.datos[i][j];
        }
    }   
    return *this;
}

};

//typedef vector< vector<int> > matrix; // tipo de dato matrix
/*
 * @brief Funcion para imprimir un vector< vector<int> >  
 * @param matrix v : matriz de tipo vector< vector<int> >  
 */
void print(matrix v)
{
    for(int i = 0; i < v.datos.size(); i++) 
    {

        for (int j =0; j < v.datos.at(0).size(); j++)
        {
            cout << v.datos[i][j] << " ";
        }
    }
    cout << endl;
}

/*
 * @brief Función combinar dos vector< vector<int> > en otro ya ordenado
 * por filas
 *
 * @param matrix v1
 * @param matrix v2
 * @return vector<int>
 */
matrix merge( matrix v1,  matrix v2){


    print(v1);
    print(v2);
    int f1 = 0,f2 = 0,c1 = 0,c2 = 0, fr=0, cr=0;

    matrix v_resultado(1,v1.datos.at(0).size()+v2.datos.at(0).size());

    //Meter números ordenados en el vector ordenado
    while(f1 < v1.datos.size() && f2 < v2.datos.size() && c1 < v1.datos.at(0).size() && c2 < v2.datos.at(0).size()){
        if(v1.datos.at(f1).at(c1) < v2.datos.at(f2).at(c2)){
            v_resultado.datos[fr][cr] = v1.datos.at(f1).at(c1);
            c1++;
            cr++;
        }
        else{
            v_resultado.datos[fr][cr] = v2.datos.at(f2).at(c2);
            c2++;
            cr++;
        }
        if (c1+1 % v1.datos.at(0).size()==0)
            {
                f1++;
                c1 = 0;
            }
        if (c2+1 % v1.datos.at(0).size()==0)
            {
                f2++;
                c2 = 0;
            }
        if (cr+1 % v1.datos.at(0).size()==0)
        {
            fr++;
            cr = 0;
        }

    }

    //Terminar de completar vector resultado
    for(f1; f1 < v1.datos.size(); f1++)
    {
        for (c1; c1 < v1.datos.at(0).size(); c1++)
        {
            v_resultado.datos[fr][cr] = v1.datos.at(f1).at(c1);
            cr++;
            if (cr+1 % v1.datos.at(0).size()) fr++;
        }

    }
    for(f2; f2 < v2.datos.size(); f2++)
    {
        for (c2; c2 < v2.datos.at(0).size(); c2++)
        {

            v_resultado.datos[fr][cr] = v1.datos.at(f2).at(c2);
            cr++;
            if (cr+1 % v1.datos.at(0).size()) fr++;

        }

    }
    print(v_resultado);
    return v_resultado;
}


/*
 *
 * @brief Funcion Recursiva que calculara  un vector ordenado 
 * @param vectores : matriz en que cada fila corresponde a un vector 
 *                   ordenado
 * @return resultAux : vector ordenado a partir 
 */

matrix mergeKvectors(matrix vectores)
{


    if (vectores.datos.size() <= 1)
    {
        cout << "Saliendo" << endl;
        print(vectores);
        return vectores;
    }


    int middle;
    if(vectores.datos.size()%2 == 0)
    {
        middle = vectores.datos.size()/2;
    }
    else
    {
        middle = (vectores.datos.size()/2) +1;
    }


    matrix up (middle ,vectores.datos.at(0).size());
    matrix down (vectores.datos.size() - middle,vectores.datos.at(0).size());   

    vector<int> Aux;



    for (int i = 0; i < middle; i++){
        for (int j = 0; j< vectores.datos.at(0).size();j++){
            up.datos[i][j] = vectores.datos[i][j];      
        }
    }   


    for (int i = middle; i < vectores.datos.size(); i++){
        for (int j = 0; j< vectores.datos.at(0).size();j++){
            down.datos[i - middle][j]= vectores.datos[i][j];        
        }
    }   


    cout << "HE LLEGADO!!!" << endl;
    print(up);
    print(down);
    //Here is where the problem is
    up = mergeKvectors(up);
    down = mergeKvectors(down);

    /*int tama_columnas = 0;
    for(int i = 0; i < vectores.datos.size();i++)
    {
        tama_columnas += vectores.datos.at(i).size();
    }*/

    matrix resultAux(1,up.datos.at(0).size()+down.datos.at(0).size());
    resultAux = merge(up, down);

    print(resultAux);
    return resultAux;   
}
/*
 *
 * @brief Funcion Principal: 
 *
 */
int main(int argc, char const *argv[]){

    if (argc != 4){
        cerr << "Formato " << argv[0] << "<ruta_del_archivo_de_entrada>  <num_elem>  <num_vect>" << endl;
        return -1;
    }

    int tam_vectores = atoi(argv[2]); //Tamaño vectores
    int num_vectores = atoi(argv[3]); //Número vectores

    int num = 0;
    string ruta=argv[1];
    ifstream archivo(ruta.c_str());
    // cargamos todos los vectores en una matriz de tipo vector<vector> 
    matrix vectorAux(num_vectores,tam_vectores);
    matrix vectorT (num_vectores, tam_vectores);
    vector< vector<int> >  vectorRes;

    for(int i = 0; i < num_vectores; i++){
        for (int j = 0 ; j < tam_vectores; j++){
            archivo >> num;
            vectorT.datos[i][j] = num;          
        }
    }       


   cout << "------------------" << endl;

   vectorAux = mergeKvectors(vectorT);

    /*for (int i =0; i < vectorAux.size(); i++)
        cout << vectorAux[i]<<" ";

    cout << " " << endl;
    */
    print(vectorAux);
    return 0;
}

非常感谢你们!

0 个答案:

没有答案