Merge sort en C++

Iniciado por BitsPuke, 7 Diciembre 2014, 13:14 PM

0 Miembros y 1 Visitante están viendo este tema.

BitsPuke

Buenas tengo que implementar este algoritmo para ordenar un vector en una practica de C++ tanto en forma recursiva y como iterativa. La recursiva la he hecho sin problemas pero llevo desde ayer dandole vueltas a la iterativa y no consigo hallar manera de implementarla en C++. Estoy atascado.

Aqui os dejo un gif sacado de wikipedia de lo que hace el algoritmo y mi codigo:


http://es.wikipedia.org/wiki/Ordenamiento_por_mezcla

Funcion main
Código (cpp) [Seleccionar]
#include "divideyvenceras.hpp"

main (){
 
  vector <int> vectorDesordenado;
 
  CrearVector(vectorDesordenado);
 
  OrdenarPorFusion(vectorDesordenado, true);
 
  MostrarVector(vectorDesordenado);
 
}


Resto del programa
Código (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>
#include <vector>
using namespace std;
#define INFINITO 2147483647

void MostrarVector (vector <int> vecT){
  for (int i=0;i<vecT.size();i++)
    cout << "[ " << vecT[i] << " ]"; 
  cout << endl;
}

void Fusionar (vector <int> &vecT, vector<int> vecU, vector <int> vecV){
  int i=0,j=0,m, n;
  m=vecU.size();
  n=vecV.size();
  vecU.push_back(INFINITO);
  vecV.push_back(INFINITO);
 
  for (int k=0; k<m+n; k++){
    if (vecU[i]<vecV[j]){
      vecT[k]=vecU[i];
      i++;
    }
    else{
      vecT[k]=vecV[j];
      j++;     
    }     
  }
 
}

void OrdenarPorFusion (vector <int> &vecT, bool verbose){
  int n=vecT.size();
  if (verbose) MostrarVector (vecT);
  if (n>1){ //Si el tamaño es lo suficientemente pequeño (?)
    vector <int> vecU;
    vector <int> vecV;
    //Dividir vector en 2
    for (int i=0; i<n; i++){
      if (i<n/2)
vecU.push_back(vecT[i]);
      else vecV.push_back(vecT[i]);     
    }
    //Recursivo   
    OrdenarPorFusion(vecU, verbose);
    OrdenarPorFusion(vecV, verbose);
    Fusionar(vecT,vecU,vecV);
  }
 
}

void CrearVector (vector <int> &vecT){
  int n;
  cout << "Tamaño del vector: ";
  cin >> n; 
 
  srand (time(NULL)); //Semilla a 0
  for (int i=0;i<n;i++)
    vecT.push_back(rand()%10); //Numero pseudoaleatorio entre 0 y 10   
}


Me pueden dar alguna pista de como hacer la version iterativa?
Muchas gracias!