No entiendo algoritmo de ordenamiento

Iniciado por JuszR, 2 Noviembre 2010, 12:13 PM

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

JuszR

No entiendo este algoritmo de ordenamiento:
Código (cpp) [Seleccionar]
const int ArraySize = 7;
int Numeros[ArraySize] = { 30, 50, 20, 10, 40, 80, 15 };

for (int StartIndex = 0; StartIndex < ArraySize; StartIndex++)
{
    int SmallestIndex = StartIndex;

   for (int CurrentIndex = StartIndex + 1; CurrentIndex < ArraySize; CurrentIndex++)
   {
       if (Numeros[CurrentIndex] < Numeros[SmallestIndex])
           SmallestIndex = CurrentIndex;
   }

   swap(Numeros[StartIndex], Numeros[SmallestIndex]);
}


Soy un novato en C++, no se quejen. :-\
- No programming language is perfect. There is not even a single best language; there are only languages well suited or perhaps poorly suited for particular purposes. [Herbert Mayer]

Castiblanco

Yo no es que entienda perfecto el código, yo el que utilizaba y el que entendía a la perfección es el de "Ordenamiento de burbuja"

Pero igual di que entiendes, pone comentarios a los que no sabes que hace y a los que sabes que hace para que quede más fácil explicarte.

Saludos...

Novlucker

#2
Había puesto otra cosa, pero luego vi la variación :P
Es una variación del de Burbuja: http://es.wikipedia.org/wiki/Ordenamiento_de_burbuja

Saludos

Edito: ahora que miro, me recuerda a otro :-\
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Castiblanco

Si se me hizo similar Novlucker  ^^, pero mucho mejor JuszR con ese articulo de la Wiki uno lo entiende mucho más rápido.

Saludos...

JuszR

Es este exactamente: http://es.wikipedia.org/wiki/Ordenamiento_por_selecci%C3%B3n (Selection sort).
El tema es que entiendo el algoritmo pero no en el código jeje.

1) Busca el número más bajo
2) Intercambia el index
3) Repite los pasos 1 y 2.


;D
- No programming language is perfect. There is not even a single best language; there are only languages well suited or perhaps poorly suited for particular purposes. [Herbert Mayer]

Novlucker

Aha! era el de selección, ahora lo veo :xD Es que el de selección y el de burbuja son iguales salvo por el intercambio, que uno lo hace durante la comparación y el otro al terminar de recorrer todos los valores, es que soy más asiduo de la burbuja o de las funciones sort que vienen integradas :-X

El código es difícil de explicar más claramente, intenta visualizarlo :-\

Saludos

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Akai


Saberuneko

Es basante simple, son dos bucles FOR, dentro de ambos se encuentra la orden de intercambio. Si el número anterior es mayor que el posterior, se intercambian.

Simplemente.

JuszR

Cita de: Akai en  2 Noviembre 2010, 13:16 PM
hazte una traza en papel, suele ayudar.
Esa es la solución. Es difícil hacer eso teniendo una computadora en frente, pero es muy efectivo. ;D

1) Lee el array [outter for].
2) Compara Current (StartIndex+1) con Smallest que por el momento era 30 (Index 0) [inner for].
3) Si es menor lo intercambia con el momentáneo Smallest [if].
4) Así sucesivamente hasta encontrar el número más chico.
5) Intercambia indexes [swap].
6) Repite todo.


Qué difícil que son los algoritmos. ;-)
- No programming language is perfect. There is not even a single best language; there are only languages well suited or perhaps poorly suited for particular purposes. [Herbert Mayer]

piou

Yo te recomiendo que mires paso a paso como van cambiando los numeros, me he hecho este código, es igualq ue el tuyo pero me he inventado una fiuncion swap, que tu no la das:
#include <stdio.h>

void swap(int *start, int *small)
{
int i = *start;
*start = *small;
*small = i;
}

int main()
{
const int ArraySize = 7;
int StartIndex = 0;
int CurrentIndex = 0;
int i = 0;
int Numeros[7] = { 30, 50, 20, 10, 40, 80, 15 };

for (StartIndex = 0; StartIndex < ArraySize; StartIndex++)
{
     int SmallestIndex = StartIndex;

    for (CurrentIndex = StartIndex + 1; CurrentIndex < ArraySize; CurrentIndex++)
    {
if (Numeros[CurrentIndex] < Numeros[SmallestIndex])
    SmallestIndex = CurrentIndex;
    }

    swap(&Numeros[StartIndex], &Numeros[SmallestIndex]);
}

for (i = 0; i < 7; i++)
{
printf("Nº: %i\n", Numeros[i]);
}
return 0;
}


Es bastante simple, para cada numero mira si los siguientes son menores, en el caso de que lo sean, llama a la función que los cambia, es una manera eficiente de ordenar una lista. Por ahí te han dejado un link a la wikipedia que lo explica bastante bien.