Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
Cargando

Autor Tema: Problema con algoritmo de ordenacion por seleccion  (Leído 610 veces)

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

Desconectado lancelot90s

  • Ladrón de espacio en la BD [L0]
  • *
  • Topic Author
  • Mensajes: 4
    • Ver Perfil
Problema con algoritmo de ordenacion por seleccion
« en: Julio 09, 2012, 11:46:07 pm »
Bueno chicos, les cuento. En estos momentos estoy pasando estructura de datos y algoritmos en mi carrera e intentando comprender los algoritmos de ordenacion. Pero al momento de implementarlos tengo varias dudas. El profesor nos mando una guia con la explicacion de los algoritmos y codificados en C. Pero al momento de implementarlos en PseInt que es un programa para escribir lenguaje en pseucodoigo sencillamente no me funciona o no lo comprendo bien.

C

Código: [Seleccionar]
void ordSeleccion (double a[], int n)
{
int indiceMenor, i, j;
/* ordenar a[0]..a[n-2] y a[n-1] en cada pasada */
for (i = 0; i < n-1; i++)
{
/* comienzo de la exploración en índice i */
indiceMenor = i;
/* j explora la sublista a[i+1]..a[n-1] */
for (j = i+1; j < n; j++)
if (a[j] < a[indiceMenor])
indiceMenor = j;
/* sitúa el elemento más pequeño en a[i] */
[b]if (i != indiceMenor)
{
double aux = a[i];
a[i] = a[indiceMenor];
a[indiceMenor] = aux ;[/b]
}
}
}

Lo que esta marcado en negrita es lo que me cuesta un poco mas entender. Aqui esta el algoritmo en pseudocodigo.

PSEUDOCODIGO

Código: [Seleccionar]
Proceso sin_titulo

Definir lista Como Entero;
Definir num_azar, indiceMenor, aux Como Entero;
Definir i, j Como Entero;

Dimension lista[5];

Para i<-0 Hasta 4 Con Paso 1 Hacer

num_azar = azar(10)+1; // genero numeros al azar del 1 a 10
lista[i] = num_azar; // llevo esos numeros al arreglo
indiceMenor = i; // ahora i que es el indice 0 pasara a esa var

Para j<-i+1 Hasta 4 Con Paso 1 Hacer

Si lista[j]<lista[indiceMenor] Entonces

indiceMenor = lista[j];
FinSi
Si i<>indiceMenor Entonces

aux = lista[i];
lista[i] = lista[indiceMenor];
lista[indiceMenor] = aux;
FinSi
FinPara
FinPara
FinProceso

La duda es especificamente, cual es la variable que me mostrara todo los numeros ordenados. Que tengo que imprimir especificamente ...


Desconectado dreams_eater

  • Conociendo la comunidad [L2]
  • **
  • Mensajes: 117
    • Ver Perfil
Re:Problema con algoritmo de ordenacion por seleccion
« Respuesta #1 en: Julio 10, 2012, 04:50:05 am »
 ¿estructura de datos y algoritmos, con PseInt ? Se supone que es una materia que se dicta al final de la carrera, no al principio.

El algoritmo de ordenación básicos, son los algoritmos de ordenación por comparación, los cuales se trata de una serie de comparaciones para determinar "fallas en el orden" llamadas inversiones. Un arreglo ordenado es aquel que no presenta inversiones.
Tienes que liberar la mente, los primeros algoritmos no serán fáciles. Tienes que jugar con objetos como un crío  y ordenar tu mismo siguiendo las reglas que gobiernan al algoritmo de selección (no hay otro camino didáctico).

En la parte delimitada en el C:
if (i != indiceMenor)
      {
         double aux = a;
         a = a[indiceMenor];
         a[indiceMenor] = aux ;
      }
El arreglo a, contiene los números, en principio desordenados.
 El cuarpo del if es en donde se realiza el intercambio.
La precondicion que te debes imaginar en que el instante en que entre , las pociciones anteriores a i desde cero a i-1, ya es un arreglo ordenado.
 indiceMenor, esta apuntando a un numero mayor o igual al del indice i-1, pero es menor o igual al restante pedazo del arreglo.

Ese if se podría sacar, puesto que el intercambio con sigo mismo no daria algún efecto negativo.

PseInt, se parece a pascalFC.
El algoritmo de Pseint esta mal, pues empiezas a ordenar los elementos antes de terminar de  definir los números del arreglo.

Proceso sin_titulo
   
    Definir lista Como Entero;
    Definir num_azar, indiceMenor, aux Como Entero;
    Definir i, j Como Entero;
   
    Dimension lista[5];
   
    Para i<-0 Hasta 4 Con Paso 1 Hacer
        num_azar = azar(10)+1; // genero numeros al azar del 1 a 10
        lista = num_azar; // llevo esos numeros al arreglo
   FinPara
   Para i<-0 Hasta 4 Con Paso 1 Hacer
        indiceMenor = i; // ahora i que es el indice 0 pasara a esa var
       
        Para j<-i+1 Hasta 4 Con Paso 1 Hacer
           
            Si lista[j]<lista[indiceMenor] Entonces
               
                indiceMenor = lista[j];
            FinSi
            Si i<>indiceMenor Entonces
                aux = lista;
                lista = lista[indiceMenor];
                lista[indiceMenor] = aux;
            FinSi
        FinPara
    FinPara

  Para i<-0 Hasta 4 Con Paso 1 Hacer
       //tienes que imprimir lista, que es un arreglo con los numeros ordenados
        imprimir lista
   FinPara
FinProceso
PD: Para más información de ordenación, Puedes echar un vistazo al Capitulo 3 mi cuaderno donde trato la ordenación, en la sección nuevos  cuadernos.[/i]
No enseñes a los otros lo que deben pensar, sino a pensar.