Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: indict en 29 Junio 2013, 22:43 pm



Título: ordenar un vector
Publicado por: indict en 29 Junio 2013, 22:43 pm
Hola, quiero ordenar un vector en orden creciente.

Para ello he creado una función que me devuelva el valor máximo del vector, así este elemento ya lo situó como el primer elemento del vector. Luego una acción para intercambiar los elementos en caso que un  elemento menor sea menor que un elemento mayor.

Gracias por la ayuda ;)

Código
  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4.  
  5. int maxim(vector<int>&v){
  6.    int i=0,m;
  7.    while(i<v.size()){
  8.  
  9.    if(v[i]>=v[m]){ m=i;
  10.                  }
  11.                      i++;
  12.                      }
  13.    return m;
  14.    }
  15.  
  16. void intercambia(int &a,int &b){
  17.     int m=a;
  18.     a=b;
  19.     b=m;
  20.     }
  21. void ordena(vector<int>&v){
  22.     int m=maxim(v);
  23.     v[0]=m;
  24.     for(int i=1;i<v.size();i++){
  25.             if(v[i]<v[i+1]){
  26.             intercambia(v[i],v[i+1]);}
  27.             }
  28.  
  29.     }
  30.  
  31. int main(){
  32.     int n,e;
  33.     cout<<"introduzca el tamaño del vector"<<endl;
  34.     cin>>n;
  35.     vector<int>v(n);
  36.  
  37.     for(int i=0;i<n;i++){
  38.     cout<<"introduzca el elemento"<<" "<<i<<" del vector"<<endl;
  39.             cin>>e;
  40.             v[i]=e;
  41.             }
  42.    ordena(v);
  43.  
  44.    for(int i=0;i<v.size();i++){
  45.            cout<<v[i]<<endl;
  46.            }
  47.    system("pause");
  48.    return 0;}
  49.  


Título: Re: ordenar un vector
Publicado por: rir3760 en 30 Junio 2013, 03:26 am
Hola, quiero ordenar un vector en orden creciente.
Lo mejor para ordenar un vector es utilizar la función sort (http://www.cplusplus.com/reference/algorithm/sort/).

Para ello he creado una función que me devuelva el valor máximo del vector
Errores en el programa hay varios. En la función "ordena":
Código
  1. int m = maxim(v);
  2. v[0] = m;
Con eso pierdes el primer valor del vector ya que no lo resguardas y si la intención es ordenar en orden ascendente el elemento mayor debe colocarse en la ultima posición.

Otro error se encuentra en la función que busca el máximo:
Código
  1. int i = 0, m;
  2.  
  3. while (i < v.size()){
  4.   if (v[i] >= v[m]){
  5.      m = i;
Ahí falta inicializar la variable "m", lo usual es asumir que el máximo es el primer elemento buscando uno mayor entre los restantes.

Otro error en el bucle de la función "ordena":
Código
  1. void ordena(vector<int>&v)
  2. {
  3.   int m = maxim(v);
  4.   v[0] = m;
  5.  
  6.   for (int i = 1; i < v.size(); i++){
  7.      if (v[i] < v[i + 1]){
  8.         intercambia(v[i], v[i + 1]);
  9.      }
  10.   }
  11. }
En la ultima iteracion del bucle el valor de "i" es "size - 1" y la expresión "i + 1" termina como "size - 1 + 1" que es igual a "size". No puedes utilizar ese valor y acceder al elemento "v[size]" ya que este no existe (los indices validos van de 0 a size-1).

Por ultimo buscar el elemento mayor me hace pensar en el algoritmo SelectSort. Por otra parte en la función donde intentas ordenar intercambias elementos adyacentes y eso es propio del algoritmo BubbleSort.

Mejor indícanos que algoritmo deseas implementar en tu programa.

Un saludo


Título: Re: ordenar un vector
Publicado por: dato000 en 30 Junio 2013, 06:46 am
Además que para poder recorrer correctamente una lista o un vector es mejor usar un iterador para apuntar exactamente al espacio de memoria reservador por el vector

http://www.cplusplus.com/reference/vector/vector/begin/

Código
  1. // vector::begin/end
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. int main ()
  6. {
  7.  std::vector<int> myvector;
  8.  for (int i=1; i<=5; i++) myvector.push_back(i);
  9.  
  10.  std::cout << "myvector contains:";
  11.  for (std::vector<int>::iterator it = myvector.begin() ; it != myvector.end(); ++it)
  12.    std::cout << ' ' << *it;
  13.  std::cout << '\n';
  14.  
  15.  return 0;
  16. }

seria algo más o menos así

Código
  1.  
  2. //Inicializando el iterador de operacion para recorrer el vector, algo asi como "int i=0"
  3. vector<int>&v::iterator it = v.begin();
  4.  
  5. for(; it != v.end(); it++)
  6. {
  7.       //algoritmo de intercambio, tu funcion tipo burbuja usando auxiliares
  8.       // ... reordenando
  9.       // ... reordenando
  10. }
  11.  
  12.  

Pues para ser practica, estas simplemente separando un burbuja de tu funcion principal, asi que independientemente si es un arreglo, una lista, un vector o similar puedes reutilizarlo, vas bien, pero te daras cuenta, que reinventar la rueda es algo ineficiente si lo llevas a terminos practicos, una vez aprendas a usar correctamente estas funciones, intenta con sort, que es una funcion de la libreria vector la cual puedes usar de diferentes formas dependiendo de lo que necesites.

cuando usas el iterador, te ahorras el problema del size y tamaños los cuales pueden salir del rango de posiciones reservadas en la memoria, pero tiene un problema muy molesto y es que cada vez que es requerido un iterador debe declararse a la justa medida de lo que se necesita, y a veces ello puede alargar innecesariamente una linea de codigo, lo que lo hace dificil de entender, para ello se ha implementado la palabra reservada "auto" pero solo funciona si es compilado bajo el estandar C++11/c++0x, y es bueno, cuando menos enredado.



Título: Re: ordenar un vector
Publicado por: indict en 30 Junio 2013, 14:17 pm
Mejor indícanos que algoritmo deseas implementar en tu programa.

El algoritmo de ordenamiento por selección.


Título: Re: ordenar un vector
Publicado por: indict en 30 Junio 2013, 14:20 pm
Lo encontré en wikipedia.

Gracias por la colaboración :D

Código
  1. void ordena_seleccion(vector<int>& v) {
  2.    for (int i = 0; i < v.size(); ++i) {
  3.        int min = i;
  4.        for (int c = i + 1; c < v.size(); ++c) {
  5.            if (v[min] > v[c]) min = c;
  6.        }
  7.        int aux = v[i];
  8.        v[i] = v[min];
  9.        v[min] = aux;
  10.    }
  11. }
  12.  


Título: Re: ordenar un vector
Publicado por: amchacon en 30 Junio 2013, 15:34 pm
Además que para poder recorrer correctamente una lista o un vector es mejor usar un iterador para apuntar exactamente al espacio de memoria reservador por el vector
Eso no es así, el operador[] también apunta al espacio de memoria.

Una de las ventajas que tiene de usar iteradores en vectores es que si después quieres cambiar a una lista, no tienes que cambiar nada del código.