Sei sulla pagina 1di 33

UNIVERSIDAD LATINA

PROGRAMACION DE ESTRUCTURAS DE DATOS

IV. MÉTODOS DE ORDENAMIENTO.

EI, Profesor Ramón Castro Liceaga


QUE SON ORDENAMIENTOS DE DATOS ?

SORT / ORDENACION.-
Es reagrupar un grupo de datos en una
secuencia especifica de orden

(mayor -> menor o menor -> mayor)

EI, Profesor Ramón Castro Liceaga


LA ORDENACION DE ELEMENTOS PUEDE SER:

• Ordenación Interna.- En memoria


principal (arrays, listas).

• Ordenación Externa.- En memoria


secundaria. (dispositivos de
almacenamiento externo.- archivos y
Bases de datos).

EI, Profesor Ramón Castro Liceaga


TIPOS DE ORDENACION

Los mas usuales son:

• POR INTERCAMBIO (Compara e intercambia elementos.- Burbuja)


• POR SELECCIÓN (Selecciona el mas pequeño y lo intercambia)
• POR INSERSION (Inserta los elementos en una sublista ordenada)
• METODO SHELL (Es una insersión mejorada)
• ORDENACION RAPIDA (Quick Sort.- divide una lista en dos partes)

EI, Profesor Ramón Castro Liceaga


ALGORITMO DE EJEMPLO DE UN ORDENAMIENTO

PROBLEMA:
En una Empresa el área de Recursos
Humanos requiere ordenar 3
números de empleados obteniendo la
siguiente salida.

EI, Profesor Ramón Castro Liceaga


POR INTERCAMBIO (Burbuja o bubble sort )

El bubble sort, también conocido como ordenamiento


burbuja, funciona de la siguiente manera:
• Se va comparando cada elemento del arreglo con el
siguiente; si un elemento es mayor que el que le sigue,
entonces se intercambian; esto producirá que en el
arreglo quede como su último elemento, el más grande.
• Este proceso deberá repetirse recorriendo todo el
arreglo hasta que no ocurra ningún intercambio.
• Los elementos que van quedando ordenados ya no se
comparan. "Baja el más pesado".

EI, Profesor Ramón Castro Liceaga


EJEMPLO: Ordenamiento por Burbuja o bubble sort

Consiste en comparar pares de elementos adyacentes e intercambiarlos


entre sí hasta que estén todos ordenados.
Sea un array de 6 números de empleados: {40,21,4,9,10,35}:

Primera pasada:
{21,40,4,9,10,35} <-- Se cambia el 21 por el 40.
{21,4,40,9,10,35} <-- Se cambia el 40 por el 4.
{21,4,9,40,10,35} <-- Se cambia el 9 por el 40.
{21,4,9,10,40,35} <-- Se cambia el 40 por el 10.
{21,4,9,10,35,40} <-- Se cambia el 35 por el 40.

Segunda pasada:
{4,21,9,10,35,40} <-- Se cambia el 21 por el 4.
{4,9,21,10,35,40} <-- Se cambia el 9 por el 21.
{4,9,10,21,35,40} <-- Se cambia el 21 por el 10.

Ya están ordenados, pero para comprobarlo habría que acabar esta segunda
comprobación y hacer una tercera.

EI, Profesor Ramón Castro Liceaga


Que son las funciones ?

Funciones.- Son bloques de código utilizados para dividir


un programa en partes mas pequeñas

Prototipo de función.- Es la declaración de la función en


el código

Variables:
Gobales.- Nivel programa
locales.- Nivel funcion
// Definimos una función donde A=arreglo y N=tamaño
int bubblesort(int A[],int N){
int i,j,AUX;
for(i=2;i<=N;i++){ //siguiente
for(j=N;j>=i;j--){ //anterior
if(A[j-1]>A[j]){ //si i > d intercambio
AUX=A[j-1]; //guardamos en AUX
A[j-1]=A[j]; //pasamos d a i
A[j]=AUX; //copiamos AUX en d
}
}
}
return 1;
} EI, Profesor Ramón Castro Liceaga
• Practica: Hacer un programa con Arreglos que ordene por el
método de la burbuja Bubblesort en forma ascendente un
vector de 10 números de empleados de una empresa.

Códificación :
main()
Pseudocódigo:
{
1.- Inicio
int A[10];
2.- Definir un vector de 10 números
llenavector(A,10); // es uma función
3.- Llenar el vector con los números printf("ORDENAMIENTO POR BURBUJA \n");
4.- Mostrar la salida de los números printf("Numeros a ordenar: \n");
capturados en desorden
salida(A,10); // es uma función
5.- Ordenar el vector por el método printf("\n\nNumeros ordenados: \n");
bubblesort
bubblesort(A,10); // es uma función
6.- Mostrar la salida con los números salida(A,10); // es uma función
ordenados del vector
getch();
}

EI, Profesor Ramón Castro Liceaga


Función que llena el vector con los números

int llenavector(int A[],int N){


int c;
int x;
cout<<"Ingrese 10 numeros de empleados:"<<endl;
for(c=1;c<=N;c++){
cin>>x; // lee x numero
A[c]=x; // lo graba en el vector
}
return 1;
}

EI, Profesor Ramón Castro Liceaga


Ordenar el vector por el método bubblesort

int bubblesort(int A[],int N){


int i,j,AUX;
for(i=2;i<=N;i++){
for(j=N;j>=i;j--){
if(A[j-1]>A[j]){
AUX=A[j-1]; //Intercambio
A[j-1]=A[j];
A[j]=AUX;
}
}
}
return 1;
}

EI, Profesor Ramón Castro Liceaga


Muestra la salida de los números en el arreglo.

int salida(int A[],int N){


int c;
for(c=1;c<=N;c++){
printf("%d, ",A[c]); // muestra el vector
}
return 1;
}

// Nota: este mismo procedimiento fue el que se utilizó para


mostrar los datos desordenados.(solo se escribe una vez)

EI, Profesor Ramón Castro Liceaga


• Practica # S01: Construir el programa
con Arreglos que ordene por el método
de la burbuja Bubblesort en forma
ascendente un vector de 10 números
de empleados de una empresa.
• Librerias:
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <conio.h>

using namespace std;

EI, Profesor Ramón Castro Liceaga


TIPOS DE ORDENACION

Los mas usuales son:

• POR INTERCAMBIO (Compara e intercambia elementos)


• POR INSERSION (Inserta los elementos en una sublista ordenada)
• POR SELECCIÓN (Selecciona el mas pequeño y lo intercambia)
• METODO SHELL (Es una insersión mejorada)
• ORDENACION RAPIDA (Quick Sort.- divide una lista en dos partes)
• CUALES SON LOS CRITERIOS DE SELECCIÓN DEL MÉTODO DE
ORDENAMIENTO
• ANÁLISIS COMPARATIVO DE LAS COMPLEJIDADES DE LOS
DISTINTOS MÉTODOS DE ORDENAMIENTO

EI, Profesor Ramón Castro Liceaga


POR INSERSION

• El insertion sort es una manera muy natural de ordenar para un ser


humano, y puede usarse fácilmente para ordenar un conjunto de
cartas numeradas en forma arbitraria.
Algoritmo:
• Consiste en tomar uno por uno los elementos de un arreglo y lo
recorre hacia su posición con respecto a los anteriormente
ordenados. Así empieza con el segundo elemento y lo ordena con
respecto al primero. Luego sigue con el tercero y lo coloca en su
posición ordenada con respecto a los dos anteriores, así
sucesivamente hasta recorrer todas las posiciones del arreglo.

• Ejemplo:
El algoritmo en pseudocódigo

algoritmo insertSort( A : lista de elementos ordenables )


para i=1 hasta longitud(A) hacer
index=A[i]
j=i-1
mientras j>=0 y A[j]>index hacer
A[j+1] = A[j]
j=j-1
fin mientras
A[j+1] = index
fin para
fin algoritmo

EI, Profesor Ramón Castro Liceaga


Programa completo

// insert-sort.cpp

#include <stdio.h>
#include <stdlib.h>

main(){
int a[]={67,8,15,44,27,12,35};
int i,aux,k;
for(i=1;i<7;i++){
aux=a[i];
k=i-1;
while((k<i)&&(aux<a[k])){
a[k+1]=a[k];
k=k-1;}
a[k+1]=aux;}
for(i=0;i<7;i++){
printf("%i\n",a[i]);}
system("pause");
}
EI, Profesor Ramón Castro Liceaga
POR SELECCION
• Este algoritmo trabaja seleccionando el dato más pequeño
a ser ordenado que aún esta en la lista, y luego haciendo
un intercambio con el elemento en la siguiente posición.

ejemplo, si tenemos el array {40,21,4,9,10,35}, los pasos a seguir son


:
{4,21,40,9,10,35} <-- Se coloca el 4, el más pequeño, en primera
posición : se cambia el 4 por el 40.

{4,9,40,21,10,35} <-- Se coloca el 9, en segunda posición: se cambia el


9 por el 21.

{4,9,10,21,40,35} <-- Se coloca el 10, en tercera posición: se cambia


el 10 por el 40.

{4,9,10,21,40,35} <-- Se coloca el 21, en tercera posición: ya está colocado.

{4,9,10,21,35,40} <-- Se coloca el 35, en tercera posición: se cambia


el 35 por el 40.
EI, Profesor Ramón Castro Liceaga
POR SELECCION

• Otro ejemplo del selection


Sort.
• Para un arreglo de :
8, 5, 2, 6, 9, 3, 1, 4,0,7

EI, Profesor Ramón Castro Liceaga


Código de la función por selección.

void selectionSort(int numbers[], int array_size)


{
int i, j;
int min, temp;
for (i = 0; i < array_size-1; i++){
min = i;
for (j = i+1; j < array_size; j++){

if (numbers[j] < numbers[min]){


min = j;
temp = numbers[i];
numbers[i] = numbers[min];
numbers[min] = temp;
}
}
}
POR METODO SHELL (Ordenamiento por bloques de datos)

• El algoritmo realiza multiples pases a través de la lista,


y en cada pasada ordena un numero igual de items. El
tamaño del set de datos (también llamado distancia o
intervalo) a ser ordenado va creciendo a medida que el
algoritmo recorre el array hasta que finalmente el set
esta compuesto por todo el array en si mismo.
• Ejemplo

EI, Profesor Ramón Castro Liceaga


POR METODO SHELL
Por ejemplo, lo pasos para ordenar el array {40,21,4,9,10,35}
mediante el método de Shell serían:

Salto=3:
Primera pasada:
{9,21,4,40,10,35} <-- se intercambian el 40 y el 9.
{9,10,4,40,21,35} <-- se intercambian el 21 y el 10.

Salto=1:
Primera pasada:
{9,4,10,40,21,35} <-- se intercambian el 10 y el 4.
{9,4,10,21,40,35} <-- se intercambian el 40 y el 21.
{9,4,10,21,35,40} <-- se intercambian el 35 y el 40.

Segunda pasada:
{4,9,10,21,35,40} <-- se intercambian el 4 y el 9.
Con sólo 6 intercambios se ha ordenado el array, cuando por
inserción se necesitaban muchos más.

EI, Profesor Ramón Castro Liceaga


void shellSort(int numbers[], int array_size)
{
int i, j, increment, temp;
increment = 3;
while (increment > 0)
{
for (i=0; i < array_size; i++)
{
j = i;
temp = numbers[i];
while ((j >= increment) && (numbers[j-increment] > temp))
{
numbers[j] = numbers[j - increment];
j = j - increment;
}
numbers[j] = temp;
}
if (increment/2 != 0)
increment = increment/2;
else if (increment == 1)
increment = 0;
else
increment = 1;
}
}

EI, Profesor Ramón Castro Liceaga


//shelSort.cpp
#include<stdio.h>
#include<conio.h> //shelSort.cpp (continuacion)
#include<cstdlib>
main()
void shellsort(int a[],int n) {
{ int a[10],i,n;
int j,i,k,m,mid; system("cls");
for(m = n/2;m>0;m/=2)
{ printf("Ingrese el numero de elementos\t: ");
for(j = m;j< n;j++) scanf("%d",&n);
{ for(i=0;i< n;i++)
for(i=j-m;i>=0;i-=m) {
{ printf("\nElement %d\t: ",i+1);
if(a[i+m]>=a[i]) scanf("%d",&a[i]);
break; }
else
{ printf("\nEn desorden : ");
mid = a[i]; for(i=0;i< n;i++)
a[i] = a[i+m]; printf("%5d",a[i]);
a[i+m] = mid; shellsort(a,n);
}
} printf("\nOrdenado : ");
} for(i=0;i< n;i++)
} printf("%5d",a[i]);
} getch();
return 0;
}
ORDENACION RAPIDA (Quick Sort) algoritmo recursivo.

• El Quick sort es un algoritmo del estilo divide y


venceras. Es bastante más rápido que el merge sort.
El algoritmo de recursión consiste en una serie de cuatro
pasos:
1. Si hay menos de un elemento a ser ordenado retorna
inmediatamente (termina).
2. Tomar un elemento del vector que sirve como “muestra”
3. Dividir el array en dos partes, una con los elementos
mayores y una con los elementos menores al muestra.
4. Repite recursivamente el algoritmo para las dos mitades
del array original hasta que queda ordenado.

EI, Profesor Ramón Castro Liceaga


Quicksort en acción sobre una lista de
números aleatorios. Las líneas
horizontales son valores pivote

EI, Profesor Ramón Castro Liceaga


•Parámetros:
•Se debe llamar a la función Quicksort desde donde quiera
ejecutarse
•Ésta llamará a colocar pivote para encontrar el valor del
mismo
•Se ejecutará el algoritmo Quicksort de forma recursiva a
ambos lados del pivote

int colocar(int *v, int b, int t)


{
int i;
int pivote, valor_pivote; void Quicksort(int* v, int b, int t)
int temp; {
pivote = b;
int pivote;
valor_pivote = v[pivote]; if(b < t){
for (i=b+1; i<=t; i++){ pivote=colocar(v, b, t);
if (v[i] < valor_pivote){ Quicksort(v, b, pivote-1);
pivote++; Quicksort(v, pivote+1, t);
temp=v[i]; }
v[i]=v[pivote];
v[pivote]=temp;
}

}
}
temp=v[b];
v[b]=v[pivote];
v[pivote]=temp;
return pivote;
}

EI, Profesor Ramón Castro Liceaga


Eficiencia en tiempo de ejecución.
Una medida de eficiencia es:

Contar el # de comparaciones (C)

Contar el # de movimientos de elementos (M)

Estos están en función de el #(n) de elementos a ser ordenados.

EI, Profesor Ramón Castro Liceaga


Algoritmos de ordenamiento:

Internos: Algoritmos de ordenamiento:

• Inserción directa. Externos:


• Inserción binaria.
• Selección directa. 1.Straight merging.
• Burbuja. 2.Natural merging.
• Shake. 3.Balanced multiway merging.
• Intercambio directo. 4.Polyphase sort.
• Shell. 5.Distribution of initial runs.
• Inserción disminución incremental.
• Heap.
• Tournament.
• Ordenamiento de árbol.
• Quick sort.
• Sort particionado.
• Merge sort.
• Radix sort.
• Cálculo de dirección.

EI, Profesor Ramón Castro Liceaga


Criterios de selección del método de
ordenamiento

EI, Profesor Ramón Castro Liceaga


Actividad adicional:

Hacer un programa en C, C++ que muestre un


menú que integre los métodos de
ordenamientos anteriormente vistos.

Fuentes:
http://aprender.fca.unam.mx/~rcastro/algoritmos-de-ordenamiento.pdf
Ejemplos de algoritmos de ordenamiento y código

Ejemplos animados.
http://www.sorting-algorithms.com/bubble-sort

EI, Profesor Ramón Castro Liceaga


GRACIAS POR TU ATENCION …

EI, Profesor Ramón Castro Liceaga

Potrebbero piacerti anche