Home Algoritmos y Estructuras de Datos (VJ1215)

Curso 2022/2023

Solución del ejercicio 12.b del tema 1

Versión 1

void mezclar(const vector<float> & v1, const vector<float> & v2, vector<float> & v3,
             int pos1, int pos2, int pos3) {

   if (pos1 == v1.size() && pos2 == v2.size())
      return;
   if (pos1 == v1.size())
      v3[pos3++] = v2[pos2++];
   else if (pos2 == v2.size())
      v3[pos3++] = v1[pos1++];
   else if (v1[pos1] < v2[pos2])
      v3[pos3++] = v1[pos1++];
   else if (v1[pos1] > v2[pos2])
      v3[pos3++] = v2[pos2++];
   else {
      v3[pos3++] = v1[pos1++];
      v3[pos3++] = v2[pos2++];
   }
   mezclar(v1, v2, v3, pos1, pos2, pos3);
}

vector<float> mezclar(const vector<float> & v1, const vector<float> & v2) {
   vector<float> v3(v1.size() + v2.size());
   mezclar(v1, v2, v3, 0, 0, 0);
   return v3;
}
	

Versión 2

void mezclar(const vector<float> & v1, const vector<float> & v2, vector<float> & v3, 
	     int pos1, int pos2, int pos3) {

   if (pos1 == v1.size() && pos2 == v2.size())
      return;
   if (pos1 == v1.size() || (pos2 < v2.size() && v1[pos1] > v2[pos2]))
      v3[pos3++] = v2[pos2++];
   else
      v3[pos3++] = v1[pos1++];
   mezclar(v1, v2, v3, pos1, pos2, pos3);
}

vector<float> mezclar(const vector<float> & v1, const vector<float> & v2) {
   vector<float> v3(v1.size() + v2.size());
   mezclar(v1, v2, v3, 0, 0, 0);
   return v3;
}
	

La siguiente variante no sería una buena solución, porque pagaría el coste temporal de copiar el vector cada vez que lo devuelve con return:

vector<float> mezclar(const vector<float> & v1, const vector<float> & v2, vector<float> & v3, 
		      int pos1, int pos2, int pos3) {

   if (pos1 == v1.size() && pos2 == v2.size())
      return v3;
   if (pos1 == v1.size() || (pos2 < v2.size() && v1[pos1] > v2[pos2]))
      v3[pos3++] = v2[pos2++];
   else
      v3[pos3++] = v1[pos1++];
   return mezclar(v1, v2, v3, pos1, pos2, pos3);
}

vector<float> mezclar(const vector<float> & v1, const vector<float> & v2) {
   vector<float> v3(v1.size() + v2.size());
   return mezclar(v1, v2, v3, 0, 0, 0);
}