elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ordenar un vector
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ordenar un vector  (Leído 4,409 veces)
indict

Desconectado Desconectado

Mensajes: 78


Ver Perfil
ordenar un vector
« 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.  


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: ordenar un vector
« Respuesta #1 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.

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


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: ordenar un vector
« Respuesta #2 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.

En línea


indict

Desconectado Desconectado

Mensajes: 78


Ver Perfil
Re: ordenar un vector
« Respuesta #3 en: 30 Junio 2013, 14:17 pm »

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

El algoritmo de ordenamiento por selección.
En línea

indict

Desconectado Desconectado

Mensajes: 78


Ver Perfil
Re: ordenar un vector
« Respuesta #4 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.  
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: ordenar un vector
« Respuesta #5 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.
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con ordenar un vector!
Programación C/C++
GregoryH 1 2,595 Último mensaje 27 Noviembre 2010, 21:49 pm
por Samnov
Ordenar Un Vector en Visual Basic.Net
Programación C/C++
jhousef_innovador 0 5,101 Último mensaje 6 Diciembre 2012, 03:17 am
por jhousef_innovador
hacer compareTo con vector de char (para ordenar nombres)
Java
d!lan 2 3,242 Último mensaje 19 Febrero 2014, 16:41 pm
por NikNitro!
Ayuda con C++ y ordenar vector de strings
Programación C/C++
rodrial12 1 6,095 Último mensaje 15 Septiembre 2014, 08:35 am
por eferion
[emu8086]Ayuda Ordenar Vector
ASM
Vanessa Delgado 0 3,918 Último mensaje 23 Octubre 2016, 05:18 am
por Vanessa Delgado
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines