我对此代码有疑问,我无法解决它。问题是它只是对递归函数进行了一次迭代,并且它们会引发分段错误。
我正在研究的问题是:我有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;
}
非常感谢你们!