Hola
Lo que trato de hacer es la mediana es algo de estadistica:
Dice si tengo
54321 ordenarlos ya lo hice
12345 Como la cantidad de valores es impar debe sacar el valor 3 en este caso ya que es el de enmedio.
pero si la cantidad de varores es par
654321 -> oredenarlos
123456 toma los dos valores intermedios en este caso 3 y 4 estos se suman 3+4/2 = 3.5 esa seria la mediana en este caso.
ahora tengo lo siquiente
If (listaElementos / 2) = (listaElementos / 2)
{
cout << ("Par");
mediana = (listaElementos - 0.5) + (listaElementos + 0.5) / 2;
cout << mediana;
}
Else
{
cout << ("Impar");
mediana = listaElementos / 2;
cout << mediana;
}
Gracias
es una duda o qué?
Citarste caso 3 y 4 estos se suman 3+4/2 = 3.5 esa seria la mediana en este caso
por orden de ejecución de operados eso es 5
http://es.wikipedia.org/wiki/Orden_de_evaluaci%C3%B3n (http://es.wikipedia.org/wiki/Orden_de_evaluaci%C3%B3n)
If (listaElementos / 2) = (listaElementos / 2)
eso debería darte error de compilación, sin contar que es incorrecto
(listaElementos - 0.5) + (listaElementos + 0.5) / 2;
incorrecto para tus fines, esto es equivalente a (x-0.5) * ( (x+0.5)/2 )
Si lo siento, si es una duda lamento si no me supe explicar pero eso es lo que queria saber si esta bien, o no como lo deberia de hacer con un for o con un if esa es la duda que tengo.
Gracias por responder.
Espero que te aclare lo siguiente:
n = numero de elementos o valores almacenados.
if ( n%2 == 0 ) <== n par
i = posicion: 0 1 2 3 4 5
valor: 1 2 3 4 5 6
posicion media = ( n-1 )/2 = (2.5) = 2 por ser la division entera.
valor medio = valor( n-1 )/2 + valor(1+( n-1 )/2) = valor(2) + valor(3) = 3 + 4
else <== n impar
i = posicion: 0 1 2 3 4
valor: 1 2 3 4 5
posicion media = ( n-1 )/2 = 2 .
valor del medio = valor( n-1 )/2 = valor(2)= 3
¡¡¡¡ Saluditos! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
EDITADO: Gracias por la observación engel lex
leosansan creoque pusiste el simbolo incorrecto
i%2 siempre va a ser < 2 :p corrijele su simbolo de division :p
y si nolasco correjido, el metodo de leolsansan es el correcto, recomiendo hacer la operacion un int para evitar errores
Gracias acaba de llegar a la casa y lo acaba de probar
Funciono perfecto mil gracias por responder.
Saludos y muchas gracias de nuevo.
Te dejo tambien mi seudocódigo o es lo que parece xD..
for (si i = 0 es menor que dos, incremeta)
if (n % 2 == 0) es par
media += a la suma de los dos intermedio = valor[(n-i)/2]
else es impar
media = numero de elementos dividido por dos = n /2
if (n % 2 == 0) si es par, sacar media apartir de la suma de los intermedios
media = suma de los intermedio dividido dos = media /2
Saludos .:
Y que tal con iteradores??
std::vector< int > lista;
lista.push_back( 1 );
lista.push_back( 2 );
lista.push_back( 3 );
lista.push_back( 4 );
lista.push_back( 5 );
lista.push_back( 6 );
auto it = lista.begin( ) + std::distance( lista.begin( ), lista.end( ) ) / 2;
if ( lista.size( ) % 2 == 0 )
std::cout << *(it - 1) << " ";
std::cout << *it;
Presupongo el vector ya ordenado porque esa parte dices que ya la tienes... aunque con un set o un multiset ( dependiendo de si admites valores duplicados o no ) te ahorrarías el tener que ordenar la lista:
std::set< int > lista;
lista.push_back( 5 );
lista.push_back( 1 );
lista.push_back( 4 );
lista.push_back( 3 );
lista.push_back( 6 );
lista.push_back( 2 );
// Aqui se imprimen ya ordenados
for ( auto it = lista.begin( ); it != lista.end( ); ++it )
std::cout << *it << std::endl;
// Y si el orden que quieres es de mayor a menor...
for ( auto it = lista.rbegin( ); it != lista.rend( ); ++it )
std::cout << *it << std::endl;