Está en la página 1de 22

ORDENAMIENTO POR SELECCIÓN DIRECTA

Este algoritmo es sencillo y se comporta razonablemente en diversas situaciones, además brinda buenos
resultados a efectos practicos, y es el que las personas utilizan generalmente al ordenar las cartas.

Inicialmente se tiene un solo elemento, que obviamente es un conjunto ordenado. Después, cuando hay k
elementos ordenados de menor a mayor, se toma el elemento k+1 y se compara con todos los elementos ya
ordenados, deteniéndose cuando se encuentra un elemento menor (todos los elementos mayores han sido
desplazados una posición a la derecha). En este punto se inserta el elemento k+1 debiendo desplazarse los demás
elementos.

Ventajas:
 Fácil implementación.
 Requerimientos mínimos de memoria
Desventajas:
- En inserción directa: Si observamos la posición del valor que estamos ordenando se "borra"
automáticamente.

PROCEDIMIENTO DEL MÉTODO DE ORDENAMIENTO POR INSERCIÓN DIRECTA

1. Partimos de un arreglo aleatoriamente ordenado, y marcamos su primer elemento como parte ordenada, el
resto será la parte desordenada.
2. Tomamos el primer elemento de la parte no ordenada, y se almacena en una variable temporal.

3. Comparamos empezando por el final de la parte ordenada, hasta que se encuentra un elemento menor.

4. Se desplaza una posición a la derecha todos los elementos que han resultado mayores que el que queremos
insertar y se coloca el valor de la variable temporal en el lugar encontrado.

Se repite el proceso hasta terminar la sección de elementos no ordenados.

DIAGRAMA DE FLUJO

PRINCIPAL:
INGRESAR:
LISTANORMAL:

LISTADOCOD:
LISTAEDAD:
LISTAPELLIDOS:
LISTANOMBRES:
PSEUDOCÓDIGOS
// PROTOTIPO

PROCEDIMIENTO ingresar (ENTERO codigo[50],CARÁCTER apellidos[30][30], CARÁCTER nombres[30][30], ENTERO


edad[50], ENTERO *pn)

PROCEDIMIENTO listadocod (ENTERO codigo[50],CARÁCTER apellidos[30][30], CARÁCTER nombres[30][30],


ENTERO edad[50], ENTERO *pn)

PROCEDIMIENTO listanormal (ENTERO codigo[50],CARÁCTER apellidos[30][30], CARÁCTER nombres[30][30],


ENTERO edad[50], ENTERO *pn)

PROCEDIMIENTO listaedad (ENTERO codigo[50],CARÁCTER apellidos[30][30], CARÁCTER nombres[30][30],


ENTERO edad[50], ENTERO *pn)

PROCEDIMIENTO listanombres (ENTERO codigo[50],CARÁCTER apellidos[30][30], CARÁCTER nombres[30][30],


ENTERO edad[50], ENTERO *pn)

PROCEDIMIENTO listapellidos (ENTERO codigo[50],CARÁCTER apellidos[30][30], CARÁCTER nombres[30][30],


ENTERO edad[50], ENTERO *pn)

// PROGRAMA PRINCIPAL

INICIO
entero opción, n, edad[50], código[50], r, j
carácter apellidos[30][30], nombres[30][30]
cadena mensaje
hacer
escribir(“menu”)
escribir(“1.- Ingreso de datos: ”)
escribir(“2.- Listado normal”)
escribir(“3.- Lista ordenada por codigo”)
escribir(“4.- Lista ordenada por edades”)
escribir(“5.- Lista ordenada por apellidos”)
escribir(“6.- Lista ordenada por nombres”)
escribir(“7.- Salir”)
escribir(“ Seleccione opción: ”)
leer(opcion)
caso opción vale
`1´: ingresar (código, apellidos, nombres, edad, &n)
`2´: listanormal (código, apellidos, nombres, edad, c)
`3´: listadocod(código, apellidos, nombres, edad, c)
`4´: listaedad(código, apellidos, nombres, edad, c)
`5´: listapellidos (código, apellidos, nombres, edad, c)
`6´: listanombres (código, apellidos, nombres, edad, c)
`7´: mensaje (“Gracias por usar el programa”)
Otro: mensaje(“error”)
Mientras(opción<>7)

FIN
// PROCEDIMIENTO INGRESO DE DATOS
PROCEDIMIENTO ingresar (ENTERO codigo[50],CARÁCTER apellidos[30][30], CARÁCTER nombres[30][30], ENTERO
edad[50], ENTERO *pn)

INICIO

Entero i,a
Hacer
Escribir(“Numero de alumnos”)
Leer(*pn)
Mientras (*pn<1 o *pn>50)
Para i de 0 a i<*pn hacer
Escribir(“Codigo”)
Leer(código[c])
Escribir(“Apellidos”)
Leer (apellidos[c])
Escribir(“Nombres”)
Leer(nombres[c])
Escribir(“Edad”)
Leer(edad[c])
Fpara
FIN

//PROCEDIMIENTO LISTA NORMAL

PROCEDIMIENTO listanormal (ENTERO codigo[50],CARÁCTER apellidos[30][30], CARÁCTER nombres[30][30],


ENTERO edad[50], ENTERO *pn)

INICIO
Entero i
Escribir(“Listado de alumnos”)
Para i de 0 a i<c hacer
Escribir(“código[i]”, “apellidos[i]”, “nombres[i]”, “edad[i]”)
Fpara
FIN

//PROCEDIMIENTO LISTA ORDENADA POR CODIGOS

PROCEDIMIENTO listadocod (ENTERO codigo[50],CARÁCTER apellidos[30][30], CARÁCTER nombres[30][30],


ENTERO edad[50], ENTERO *pn)

INICIO
Entero i,j,temp

Escribir(“Lista ordenada por codigos”)


Para i de 0 a i<c hacer
Temp=código[i]
Mientras (j>=0 y temp<código[j]) hacer
Código[j+1]=código[j--]
Código[j+1]=temp
Fmientras
Fpara

Para i de 0 a i<c hacer


Escribir(“código[i]”)
Fpara
FIN

//PROCEDIMIENTO LISTA ORDENADA POR NOMBRES

PROCEDIMIENTO listanombres (ENTERO codigo[50],CARÁCTER apellidos[30][30], CARÁCTER nombres[30][30],


ENTERO edad[50], ENTERO *pn)

INICIO

Entero i,j
Carácter temp[30]
Real comp

Escribir(“Lista ordenada por nombres”)


Para i de 0 a i<c hacer
Para j de 0 a j<c hacer
Comp=comparación(nombres[j],nombres[j+1])
Si (comp>0) entonces
Copiar nombres[j] en temp
Copiar nombres[j+1] en nombres[j]
Copiar temp en nombres[j+1]
Fsi
Fpara
Fpara
Para i de 0 a i<c hacer
Escribir(“nombres[i]”)
Fpara

FIN

//PROCEDIMIENTO LISTA ORDENADA POR APELLIDOS

PROCEDIMIENTO listapellidos (ENTERO codigo[50],CARÁCTER apellidos[30][30], CARÁCTER nombres[30][30],


ENTERO edad[50], ENTERO *pn)

INICIO
Entero i,j
Carácter temp[30]
Real comp

Escribir(“Lista ordenada por apellidos”)


Para i de 0 a i<c hacer
Para j de 0 a j<c hacer
Comp=comparación(apellidos [j], apellidos [j+1])
Si (comp>0) entonces
Copiar apellidos [j] en temp
Copiar apellidos [j+1] en apellidos [j]
Copiar temp en apellidos [j+1]
Fsi
Fpara
Fpara
Para i de 0 a i<c hacer
Escribir(“apellidos [i]”)
Fpara
FIN

//PROCEDIMIENTO LISTA ORDENADA POR EDADES

PROCEDIMIENTO listaedad (ENTERO codigo[50],CARÁCTER apellidos[30][30], CARÁCTER nombres[30][30],


ENTERO edad[50], ENTERO *pn)

INICIO

Entero i,j,temp

Escribir(“Lista ordenada por edades”)


Para i de 0 a i<c hacer
Temp=edad[i]
Mientras (j>=0 y temp< edad [j]) hacer
edad [j+1]= edad [j--]
edad [j+1]=temp
Fmientras
Fpara

Para i de 0 a i<c hacer


Escribir(“edad[i]”)
Fpara

FIN

PANTALLAS
CODIFICACION EN C++

#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <ctype.h>

using namespace std;


int c=0;

void ingresar(int codigo[50],char apellidos[30][30],char nombres[30][30],int edad[50],int *pn);


void listadocod(int codigo[50],char apellidos[30][30],char nombres[30][30],int edad[50],int c);
void listanormal(int codigo[50],char apellidos[30][30],char nombres[30][30],int edad[50],int c);
void listaedad(int codigo[50],char apellidos[30][30],char nombres[30][30],int edad[50],int c);
void listanombres(int codigo[50],char apellidos[30][30],char nombres[30][30],int edad[50],int c);
void listapellidos(int codigo[50],char apellidos[30][30],char nombres[30][30],int edad[50],int c);

int main()
{
int opcion,n,edad[50],codigo[50],r,j;
char apellidos[30][30],nombres[30][30];

//Programa Principal
do
{

cout<<" "<<endl;
cout<<" ...:::#::: Programa de Ordenamiento por Insercion Directa :::#::::...";
cout<<" "<<endl;
cout<<"\n MENU";
cout<<" "<<endl;
cout<<"\n 1. Ingreso de datos: Codigo, Apellidos, Nombres, Edad";
cout<<"\n 2. Listado Normal";
cout<<"\n 3. Lista Ordenada de Codigos";
cout<<"\n 4. Lista Ordenada de Edades";
cout<<"\n 5. Lista Ordenada por Apellidos";
cout<<"\n 6. Lista Ordenada por Nombres";
cout<<"\n 7. Salir";
cout<<" "<<endl;
cout<<"\n Seleccione opcion: ";
cin>>opcion;
switch(opcion)
{
case 1:ingresar(codigo,apellidos,nombres,edad,&n);
cout<<" "<<endl;
cout<<" -------------------------------------"<<endl;
system("PAUSE");
system("cls");
break;
case 2:listanormal(codigo,apellidos,nombres,edad,c);
cout<<" "<<endl;
system("PAUSE");
fflush(stdin);
system("cls");
break;

case 3:listadocod(codigo,apellidos,nombres,edad,c);
cout<<" "<<endl;
system("PAUSE");
fflush(stdin);
system("cls");
break;

case 4:listaedad(codigo,apellidos,nombres,edad,c);
cout<<" "<<endl;
system("PAUSE");
fflush(stdin);
system("cls");
break;

case 5:listapellidos(codigo,apellidos,nombres,edad,c);
cout<<" "<<endl;
system("PAUSE");
fflush(stdin);
system("cls");
break;

case 6:listanombres(codigo,apellidos,nombres,edad,c);
cout<<" "<<endl;
system("PAUSE");
fflush(stdin);
system("cls");
break;

case 7:
cout<<" "<<endl;
cout<<" Gracias por usar el programa ...";
cout<<" "<<endl;
break;

default:cout<<" "<<endl;
cout<<"Error, pulse 1,2,3,4,5,6 o 7"<<endl;
cout<<" "<<endl;
system("PAUSE");
fflush(stdin);
system("cls");
break;
}

}while(opcion!=7);
cout<<" "<<endl;

system("PAUSE");
return EXIT_SUCCESS;
}

//Procedimiento Ingreso de datos

void ingresar(int codigo[50],char apellidos[30][30],char nombres[30][30],int edad[50],int *pn)


{int i,a;

do{
cout<<"\n Numero de alumnos(Entre 1 y 50): ";
cin>>*pn;
}while(*pn<1 || *pn>50);

for(i=0;i<*pn;i++)
{
cout<<" -------------------------------------"<<endl;
cout<<"\n Codigo (Solo Numeros): ";
cin>>codigo[c];
fflush(stdin);
cout<<"\n Apellidos: ";
cin.getline(apellidos[c],28);
cout<<"\n Nombres: ";
cin.getline(nombres[c],28);
cout<<"\n Edad: ";
cin>>edad[c];
c++;

}
}

//Procedimiento lista normal


void listanormal(int codigo[50],char apellidos[30][30],char nombres[30][30],int edad[50],int c)
{
int i,j,temp;
cout<<"\n\n"<<"\t\t\tLISTADO DE ALUMNOS";
cout<<"\n"<<"\t\t\t------------------";
cout<<" "<<endl;
cout<<"\n"<<" CODIGO"<<"\t\tAPELLIDOS Y NOMBRES"<<"\t\tEDAD";

for(i=0;i<c;i++)
{
cout<<"\n"<<codigo[i]<<"\t"<<apellidos[i]<<" "<<nombres[i]<<"\t\t\t"<<edad[i];
}
cout<<"\n\n";
c++;
return;
}
//Procedimiento lista ordenada por codigos
void listadocod(int codigo[50],char apellidos[30][30],char nombres[30][30],int edad[50],int c)
{int i,j,temp;

cout<<"\n\n"<<"\t\t\tLISTA ORDENADA POR CODIGOS";


cout<<"\n"<<"\t\t\t--------------------------";
cout<<" "<<endl;
cout<<"\n"<<" CODIGO";

for(i=0;i<c;i++)
{
temp=codigo[i];
j=i-1;
while(j>=0 && temp<codigo[j])
codigo[j+1]=codigo[j--];
codigo[j+1]=temp;

}
for(i=0;i<c;i++)
{
cout<<"\n\t"<<codigo[i];
}

cout<<"\n\n";
}

//Procedimiento lista ordenada por nombres


void listanombres(int codigo[50],char apellidos[30][30],char nombres[30][30],int edad[50],int c)
{
int i,j;
char temp[30];
float comp;

cout<<"\n\n"<<"\t\t\tLISTA ORDENADA POR NOMBRES";


cout<<"\n"<<"\t\t\t--------------------------";
cout<<" "<<endl;
cout<<"\n"<<" NOMBRES";

for(i=0;i<c;i++)
{
for(j=0;j<c-i;j++)
{
comp = strcmp( nombres[j], nombres[j+1]);
if(comp > 0)
{
strcpy(temp,nombres[j]);
strcpy(nombres[j],nombres[j+1]);
strcpy(nombres[j+1],temp);
}
}
}

for(i=0;i<c;i++)
{
cout<<"\n\t"<<nombres[i];
}
cout<<"\n\n";
c++;
return;

//Procedimiento lista ordenada por Apellidos


void listapellidos(int codigo[50],char apellidos[30][30],char nombres[30][30],int edad[50],int c)
{
int i,j;
char temp[30];
float comp;

cout<<"\n\n"<<"\t\t\tLISTA ORDENADA POR APELLIDOS";


cout<<"\n"<<"\t\t\t----------------------------";
cout<<" "<<endl;
cout<<"\n"<<" APELLIDOS";

for(i=0;i<c;i++)
{
for(j=0;j<c-i;j++)
{
comp = strcmp(apellidos[j],apellidos[j+1]);
if(comp > 0)
{
strcpy(temp,apellidos[j]);
strcpy(apellidos[j],apellidos[j+1]);
strcpy(apellidos[j+1],temp);
}
}

for(i=0;i<c;i++)
{
cout<<"\n\t"<<apellidos[i];
}
cout<<"\n\n";

//Procedimiento lista ordenada por edades


void listaedad(int codigo[50],char apellidos[30][30],char nombres[30][30],int edad[50],int c)
{
int i,j,temp;
cout<<"\n\n"<<"\t\t\tLISTA ORDENADA POR EDADES";
cout<<"\n"<<"\t\t\t-------------------------";
cout<<" "<<endl;
cout<<"\t"<<" EDADES";

for(i=0;i<c;i++)
{
temp=edad[i];
j=i-1;
while(j>=0 && temp<edad[j])
edad[j+1]=edad[j--];
edad[j+1]=temp;

for(i=0;i<c;i++)
{
cout<<"\n\t"<<edad[i];
}

cout<<"\n\n";
c++;
return;

PRUEBA DEL MÉTODO APLICADO

CONCLUSIONES
El ordenamiento por inserción directa es práctico y sencillo, se encuentra entre los métodos más eficientes pues

sus operaciones son pocas en comparación con otros métodos. La utilidad de este programa radica en la

capacidad para comprender este método, pues la lógica es similar a la de cualquier persona al ordenar cartas que

encuentre al azar y de forma desordenada.

También podría gustarte