Beruflich Dokumente
Kultur Dokumente
Debido a que las estructuras de datos son utilizadas para almacenar informacin,
para poder recuperar esa informacin de manera eficiente es deseable que aquella est
ordenada. Existen varios mtodos para ordenar las diferentes estructuras de datos
bsicas.
En general los mtodos de ordenamiento no son utilizados con frecuencia, en
algunos casos slo una vez. Hay mtodos muy simples de implementar que son tiles en
los casos en dnde el nmero de elementos a ordenar no es muy grande (ej, menos de
500 elementos). Por otro lado hay mtodos sofisticados, ms difciles de implementar
pero que son ms eficientes en cuestin de tiempo de ejecucin.
Los mtodos sencillos por lo general requieren de aproximadamente n x n pasos
para ordenar n elementos.
Los mtodos simples son: insertion sort (o por insercin directa) selection sort,
bubble sort, y shellsort, en dnde el ltimo es una extensn al insertion sort, siendo ms
rpido. Los mtodos ms complejos son el quick-sort, el heap sort, radix y addresscalculation sort. El ordenar un grupo de datos significa mover los datos o sus referencias
para que queden en una secuencia tal que represente un orden, el cual puede ser
numrico, alfabtico o incluso alfanumrico, ascendente o descendente.
Se ha dicho que el ordenamiento puede efectuarse moviendo los registros con las
claves. El mover un registro completo implica un costo, el cual se incrementa conforme
sea mayor el tamao del registro. Es por ello que es deseable evitar al mximo el
movimiento de los registros. Una alternativa es el crear una tabla de referencias a los
registros y mover las referencias y no los datos. A continuacin se mostrarn los
mtodos de ordenamiento empezando por el ms sencillo y avanzando hacia los ms
sofisticados
La eficiencia de los algoritmos se mide por el nmero de comparaciones e intercambios
que tienen que hacer, es decir, se toma n como el nmero de elementos que tiene el
arreglo a ordenar y se dice que un algoritmo realiza O(n2) comparaciones cuando
compara n veces los n elementos, n x n = n2.
ORDENAMIENTO DE BURBUJA
La Ordenacin de burbuja (Bubble Sort en ingls) es un sencillo algoritmo de
ordenamiento. Funciona revisando cada elemento de la lista que va a ser ordenada con
el siguiente, intercambindolos de posicin si estn en el orden equivocado. Es
necesario revisar varias veces toda la lista hasta que no se necesiten ms intercambios,
lo cual significa que la lista est ordenada. Este algoritmo obtiene su nombre de la
forma con la que suben por la lista los elementos durante los intercambios, como si
fueran pequeas "burbujas". Tambin es conocido como el mtodo del intercambio
directo. Dado que solo usa comparaciones para operar elementos, se lo considera un
algoritmo de comparacin, siendo el ms sencillo de implementar.
burbuja
#include<stdio.h>
#include<conio.h>
int a[3]={3,2,1};
int i,j,aux,n=3;
void main(){
clrscr();
for(i=0;i<=n;i++){
for(j=0;j<n-1;j++){
if(a[j]>a[j+1]){
aux=a[j];
a[j]=a[j+1];
a[j+1]=aux;
}
}
}
for(i=0;i<3;i++)
{
printf("%d",a);
}
getch();
}
ORDENAMIENTO SHELL
El ordenamiento Shell (Shell sort en ingls) es un algoritmo de ordenamiento. El mtodo se
denomina Shell en honor de su inventor Donald Shell. Su implementacin original,
requiere O(n2) comparaciones e intercambios en el peor caso. Un cambio menor presentado en
el libro de V. Pratt produce una implementacin con un rendimiento de O(n log2 n) en el peor
caso. Esto es mejor que las O(n2) comparaciones requeridas por algoritmos simples pero peor
que el ptimo O(n log n). Aunque es fcil desarrollar un sentido intuitivo de cmo funciona este
algoritmo, es muy difcil analizar su tiempo de ejecucin. El algoritmo Shell sort mejora el
ordenamiento por insercin comparando elementos separados por un espacio de varias
posiciones. Esto permite que un elemento haga "pasos ms grandes" hacia su posicin esperada.
Los pasos mltiples sobre los datos se hacen con tamaos de espacio cada vez ms pequeos. El
ltimo paso del Shell sort es un simple ordenamiento por insercin, pero para entonces, ya est
garantizado que los datos del vector estn casi ordenados.
shell
#include<stdio.h>
#include<conio.h>
int a[5];
int n=5;
void main()
{
int inter=(n/2),i=0,j=0,k=0,aux;
clrscr();
for (i=0; i<5; i++)
{
printf("INSERTA UN VALOR DEL INDICE %d", i);
scanf("%d",& a);
}
while(inter>0){
for(i=inter;i<n;i++)
{
j=i-inter;
while(j>=0) {
k=j+inter;
if(a[j]<=a[k]){
j--;
}
else{
aux=a[j];
a[j]=a[k];
a[k]=aux;
j=j-inter;
}
}
}
inter=inter/2;
}
for(i=0;i<5;i++)
{
printf("%d n",a);
getch();
}
}
int i,j,aux;
void main(){
clrscr();
for(i=1;i<n;i++)
{
j=i;
aux=a;
while(j>0 && aux<a[j-1])
{
a[j]=a[j-1];
j--;
}
a[j]=aux;
}
for(i=0;i<4;i++)
{
printf("%d",a);
}
getch();
}
Su funcionamiento es el siguiente:
Y en general:
Buscar el mnimo elemento entre una posicin i y el final de la lista
Intercambiar el mnimo con el elemento de la posicin i
De esta manera se puede escribir el siguiente pseudocdigo para ordenar una lista
de n elementos indexados desde el 1:
Para i=1 hasta n-1
minimo = i;
Para j=i+1 hasta n
Si lista[j] < lista [minimo] entonces
minimo = j /* (!) */
Fin si
Fin para