Ordenar vector en otro vector

djtonight

Buenas, no consigo hacer lo que dice el título. es ecir:

Teniendo un vector desordenado, buscar el elemento menor y ponerlo en el vector ordenado, asi continuamente hasta que hemos rellenado todo el vector ordenado.

se hacer el metodo de la burbuja, etc...PERO ESTE NO ME SALE.

Si me lo vais a explicar con codigo(please) que sea lo mas parecido a C# para que yo lo entienda xD.

Bueno, esto es un ejercicio de grado superior de sistemas, así que como aqui hay mucho ingeniero o proyecto de ingeniero, este ejercicio será easy para él.

pd: ya he buscado en google.
pd2: si no entendeis de que va el prog, preguntad.

muchas gracias de antemano

_kRuStY_

Explica un poco mejor lo que buscas. Tienes un vector desordenado y tienes que crear uno nuevo ordenado? te piden algun algoritmo en especial? tamaños de los vectores? fijos o variables?

djtonight

Pon que tienes el vector desordenado {4,1,87,2,5}
y luego un vector de tamaño 5.

se trata de que en el vector de tamaño 5 que no tiene nada, aparezca...{1,2,4,5,87}

pero no vale ordenar el desordenado directamente y copiarlo al otro.

se trata de ir buscando en el vector desordenado el numero menor para meterlo en la primera casilla del otro vector.

es decir...primero busca cual es el menor del vector...osea el 1, y lo mete en nuevovector[0]
luego busca el siguiente menor(osea el menor que no sea el 1) y lo mete en nuevovector[1]
luego busca el siguiente menor(osea el menor que no sea el 1 ni el 2) y lo mete en nuevovector[2]
y asi hasta que se llena el vector nuevo

IAF

Pues nose si te liare ahora pero asi rapido y chapuzero haria:

int DIMv1 = 0;
int DIMv2 = 0;
int aux = v1[0];
for (recorrer vector original desde v[1])
{
if (v2[DIMv2] >= v1 && v1 < v[i-1])
aux = v1
v2[DIMv2] = aux
DIMv2++
}

Nose si esta bien y no creo que sea muy efectivo xD pero en teoria hace una primera pasada al v1 buscando el valor mas pequeño i lo pone en el v2, hace una segunda pasada i busca el valor mas pequeño que no sea mas menor que el ultimo puesto en el v2 i asi va haciendo

_kRuStY_
/* busca el menor elemento a partir de un limite */
buscaMenor (limite,max,vector){

   int min=1000000;

   for(i=0;i<max;i++){
      if (vector[i]<min) && (vector[i]>limite)
      min=vector[i];
   }

}

main{

   int limite=0;

   for(i=0;i<long;i++){
      min=buscaMenor(limite,long,vector);
      limite=min;
      vectorAux[i]=min;
   }

}

Siento no poder ponerlo en C++, pero no creo que te cueste mucho traducirlo. No lo he probado compilandolo ni nada. Lo que hace buscaMenor es buscar el menor elemento del vector que le pases pero por ejemplo, si ya has encontraod el 1, pues como limite va a pasar 1 y te va a devolver el elemento menor a partir de 1, y devolveria el 2.
Lo de la longitud y eso ya esque no sabia como lo vas a acer, pero se la pasas a buscaMenor como max para completar el bucle y ya esta.

Si esta mal o te da problemas dilo por aqui

Saludos ^^

djtonight

voi a probar con los 2 gracias

no me sale ná xD

B

no seria mas facil recorrer el vector i meter el primer elemento que te encuentras en una variable, y comparar el siguiente con ese numero, si es menor, lo guardas en la variable, si no es menor continuas con el siguiente numero. Cuando as terminado de recorrer el vector, guardas el numero que hay en la variable en el otro vector i vuelves a recorrer el vector pero esta vez el valor a comparar es el que ya ai en la variable para comparar.

dagavi

Si, lo único que tiene que hacer es:

Primer elemento del vector resultante -> Elemento más pequeño del vector desordenado

Elemento i-ésimo del vector resultanto (i != 0) -> Elemento más pequeño del vector desordenado y que sea mayor a res

Edit: He realizado este en C++ que parece que funiona: http://pastebin.es/2028 <-- Comentado

vector<int> ordena(const vector<int>& v) {
    int m = v.size();
    vector<int> res(m);
    
for (int i = 0; i < m; ++i) { int min; int c = 0; if (i == 0) min = v[0]; else { while (v[c] <= res[i - 1]) ++c; min = v[c]; } ++c; while (c < m) { if (v[c] < min) { if (i == 0 or v[c] > res[i - 1]) min = v[c]; } ++c; } res[i] = min; } return res; }

PD: Poner "int min=1000000; " es una xapucilla ee xDD es demasiado facil joder el programa poniendo simplemente 1000001
Puestos a hacer eso crea un long int y pones un número no representable con un INT, así te aseguras de que realmente siempre será mayor xD Igual que poner "limite = 0" te impide ordenar números negativos.

_kRuStY_

Era solo un ejemplo rapido para chaval....El codigo de error que ya lo haga el como vea, era solo para darle un codigo asi de referencia rapido. A ver si ahora me vas a enseñar a programar.... xD

PD: #7...y que es lo que hace mi codigo? exactamente eso solo que con una funcion

dagavi

"Si esta mal o te da problemas dilo por aqui"
El puede decirte que está mal y yo no? xDD

_kRuStY_

¬¬...si eso lo consideras error...si esta mal. No te preocupes, la proxima vez estudiare el problema a fondo y hare un proyecto serio.

Siento mi error :S

sh0ty

int Lista[10], Mayor=0;
for(int I=0; I<9; I++) {
for(int i=0; i<9-I; i++) {
if (Lista>Lista[i+1]) {
Mayor=Lista;
Lista=Lista[i+1];
Lista[i+1]=Mayor;
}
}
}

El codigo consta de dos bucles: el segundo se encarga de comparar los elementos de dos en dos y colocar el mayor delante del menor y viceversa hasta el noveno elemento (ya que el decimo no tiene con cual compararse). Y el primero solamente repite ese ciclo tantas veces como elementos-1 tiene la lista (9) haciendo que cada vez el segundo bucle sea mas corto porque como ya sabras una vez se usa el metodo de la burbuja el ultimo elemento es sin riesgo a equivocacion el mas grande (o pequeño) de toda la lista. Lo mismo pasa cuando se usa por segunda vez pero esta vez con los dos ultimos elementos, y la tercera con los tres, la cuarta con los cuatro, y suma y sigue...

#11
No esta mal (o si, no lo se, no lo he probado) pero eso de poner un limite arbitrario es poco preciso... es como si un ingeniero sabiendo que un coche necesitara tener mucha resistencia decide poner 10 parachoques a la tururu.

_kRuStY_

vamos a ver...que no me teneis que enseñar a programa aora...que era para darle una idea rapida........Siento haberos defraudado grandes ingenieros de la informatica... ¬¬

JuAn4k4

buscarMenor deberia, cojer el menor e intercambiarlo con el ultimo disminuyendo el maximo en 1. ¿ no ?
No se C# pero sera parecido a C++ / C no ?

No lo he compilado ni nada pero no distara mucho, si son enteros lo que ordenas cambia elemento por int y ya ta.

EDIT: Acabo de ver lo de "min = 10000;" , joer : min = v[0]; y ya empiezas en el 1. Y lo del limite, si tienes -1 ya la has jodio xD.

PD: Faltaria la funcion intercambia pero esa no hara falta q la ponga vdd ?


elemento menor(elemento* v, int* max){
  int i;
  elemento e;
  int j;

 e=v[0];
 for ( i=1; i<=*max; i++)
  {
    if ( v[i] < e)
    { e = v[i]; 
       j = i; 
    }
  }

 intercambia(v[*max],v[j]);
 *max= *max-1;
 return e;
}

elemento* ordena(elemento *v, int numElementos){
  elemento ord[numElementos]; // No se si funcionara eso
  elemento aux;
  int i,j,n;
  n= numElementos;
 for(i=0;i<numElementos; i++)
  { aux=  menor(v,&n);
     ord[i] = aux;
  }
}
dagavi

No creo que le valga la solución ya que modificas el vector V original, finalmente metes el elemento más pequeño (el que retornas), al final del vector V que no debería modificarse.

Además, esto ya lo estamos discutiendo más para nosotros ya que el que creó el hilo parece que no se pasa xD

PD: El que puse antes funciona y no modifica el vector original! xD

sh0ty

Mi codigo funciona perfectamente y a la primera. La mayoria no usais el metodo de la burbuja y por eso os salen codigos tan complicados, con dos bucles es mas que suficiente.

dagavi

Nadie ha dicho que el tuyo no funcione, pero lo que sucede es que tucoges y modificas el vector original (ojo, también es cierto que el no ha dicho que no se pueda modificar).

Tu función "menor" es un buble sort sobre un vector V y un límite de ordenación "max" (hasta que posición se ordenará), haces una pasada modificando el vector original y pones en la última posición del vector (después penúltima, etc.) el elemento más pequeño que has encontrado, es decir, modificas el vector original (que como repito, también es cierto que no ha dicho que no se pueda modificar xD simplemente es algo que yo di por echo).

El tuyo deja el vector original ordenado a la inversa, y el nuevo (el que retorna) ordenado crecientemente, pero puestos a modificarlo ya puedes hacer una copia directa sin returns:

for (int i = 0....) {
    for () {
    }
    ordenado[i] = original[i]; // O en tu caso original[final - i]
}
Zen_de_Fenix

Bueno, no sé si he entendido bien, hace tiempo que no programo. Pero, quiero comprobar lo oxidado que estoy! XD Por de pronto se que ya no recuerdo ni el seudolenguaje! XD Pero bueno, esto es lo que haría yo. Chapuzeado al máximo! XD

Leer primera posición. i=vec1 (Por ejemplo)
Comparar con la siguiente posición. i+1<=vec1
Si es menor o igual i+1=Vec1
Si no pasas a la siguiente posición del vector i+2
Y vuelves a comparar. (con esto buscas el valor mínimo comparándolo con el resto de elementos del vector si tener que usar valores limites, solo el contenido del vector).
Repetir hasta ultima posición del vector.
Escribir Posición en nuevo vector.
Repetir búsqueda hasta el final de la longitud del vector.

Usuarios habituales