Anda di halaman 1dari 21

Estructura de Datos II

Ing. Ivn Andr Hernndez Garca @himexo

Algoritmo
Es una secuencia de pasos lgicos finitos para resolver un problema.

Clasificacin de los algoritmos


Los algoritmos con el manejo de la informacin se clasifican en : a) De ordenacin b) De bsqueda Ambos procesos pueden clasificarse como internos o externos dependiendo del lugar en el que se encuentre almacenada la informacin. Los internos se llevan a cabo en memoria principal; los externos se realizan en memoria secundaria (Discos flexibles, cintas, discos duros, etctera). La operacin de bsqueda es la que permite recuperar datos previamente almacenados. Ordenar significa reorganizar un conjunto de datos u objetos de acuerdo a una secuencia especfica. El proceso de ordenacin es importante cuando requiere optimizarse un proceso de bsqueda.

Formalmente definimos ordenacin de la siguiente manera: Sea A una lista de n elementos Ao, A1, A2,...,An. La lista A estar ordenada despus de aplicarle un proceso logramos que: a) Ao <= A1 <= A2 ... <=An (ordenamiento ascendente) b) Ao>= A1 >= A2 ...>= An (ordenamiento Descendente) Un mtodo de ordenacin es estable si el orden relativo de elementos iguales permanece inalterado durante el proceso de ordenacin. La estabilidad es conveniente si los elementos ya se encontraban ordenados conforme a algn otro campo. Un mtodo de ordenacin es inestable si se altera el orden relativo de elementos iguales durante el proceso de ordenacin.

Burbuja
La idea bsica de este algoritmo consiste en comparar pares de elementos adyacentes e intercambiarlos entre s hasta que todos se encuentran ordenados. Se realizan (n-1) pasadas, transportando en cada una de las mismas el menor o mayor elemento (segn sea el caso) a su posicin ideal. Al final de las (n-1) pasadas los elementos del arreglo estarn ordenados. void Intercambio_Directo(int n) { int i,j,aux; i=0; j= n-1; for(;j>0;j--) for(i=0;i<j;i++) //recorre el arreglo de 0 a n-1 { if (arr[i]>arr[i+1]) //si el elemento actual es mayor que el elemento siguiente { aux=arr[i]; //intercambio de elementos arr[i]=arr[i+1]; arr[i+1]=aux; } } }

Shell
Este mtodo consiste en subdividir el arreglo original en grupos de elementos mas pequeos. Dichos grupos estn compuestos por los elementos separados por k posiciones. En seguida se aplica el mtodo de ordenacin por insercin directa en cada subgrupo el proceso se repite empezando con una k grande y decrementadola en cada iteracin hasta llegar a k = 1. QUE INCREMENTOS SON MEJORES? Una buena poltica es que las k elegidas no sean mltiplos de si mismas. Knuth sugiere la siguiente secuencia: 1,4,13,40,121,..., (3m-1)/2 1,3,7,15,31,63,127,...,2m -1 Para esta ultima opcin se a encontrado que el esfuerzo para este mtodo es del orden de n1.2 void shell(int n) { int i,j,m,k,x; for(m=t;m>0;m--) { k=pow(2,m)-1; for(i=k;i<n;i++) { x=arr[i]; j=i-k; while(x<arr[j]&& j>=0) { arr[j+k]=arr[j]; j-=k; } arr[j+k]=x; } } }

Quick Sort
Este algoritmo es uno de los mejores que se conocen hasta hoy en da. Es una mejora del mtodo de ordenacin por intercambio directo y consiste en: 1) Elegir un elemento x al azar 2) Buscar por la izquierda del arreglo un elemento mayor que x 3) Buscar por la derecha un elemento menor o igual que x 4) Si no se han cruzado los ndices izquierda y derecha intercambiar el elemento mayor. 5) Repetir desde el paso 2) mientras no se crucen los ndices izquierda y derecho. 6) Intercambiar x con el elemento de la derecha 7) En este momento el elemento x divide el arreglo en dos subarreglos tales que el subarreglo izquierdo contiene los elementos <= que x y el subarreglo derecho > que x, por lo tanto x esta ordenado. 8) Hacer quicksort con el arreglo izquierdo 9) Hacer quicksort con el arreglo derecho.

Arbol
El Heapsort est basado en el uso de un tipo especial de rbol binario (llamado apilamiento) para estructurar el proceso de ordenamiento. La estructura de ramificacin del rbol conserva el nmero de comparaciones necesarias en :

Aunque el Heapsort tiene un mejor desempeo general que cualquier otro mtodo presentado de clasificacin interna, es bastante complejo de programar. El Heapsort fue desarrollado en 1964 por J. W. J. Williams.

La estructura de este rbol tiene las siguientes caractersticas:

Las llaves estn acomodadas en los


nodos de tal manera que, para cada nodo i, Ki <= Kj donde el nodo j es el padre del nodo i.

El rbol se llena de izquierda a derecha.

function heapsort(array A[0..n]): montculo M integer i := 124578 for i = 0..n: insertar_en_monticulo(M, A[i]) for i = 0..n: A[i] = extraer_cima_del_monticulo(M) return A

Mtodos de ordenamiento por Intercalacin

Intercalacin Simple
El mtodo de ordenacin por intercalacin es utilizado por los jugadores de cartas o naipes para ordenar sus barajas. Consiste en mirar las cartas una a una y cuando se ve cada nueva carta se inserta en el lugar adecuado. Para desarrollar el algoritmo imaginemos que las cartas se encuentran situadas en una fila encima del tapete; a medida que se ve una carta nueva, sta se compara con la fila y se debe empujar alguna de ellas a la derecha para dejar espacio e insertar la nueva. Consideremos un vector de n posiciones. Comencemos con el subndice i en la segunda posicin incrementando en 1, el elemento del subndice del vector se elimina de la secuencia y se reinserta en el vector en la posicin adecuada.

n=tamao del vector


int i,k,aux; boolean band=false; for (k=1;k < n; k++) { aux=vect[k]; i=k-1; band=false; while( i>=0 && !band ) { if(aux < vect[i]) { vect[i+1]=vect[i]; i--; } else { band=true; } } vect[i+1]=aux; }

Intercalacin Merge
Cuando se dispone de dos vectores ya ordenados y se desea obtener un tercer vector tambin ordenado, se puede realizar la ordenacin con un mtodo denominado Mezcla (Merge en ingles). Supongamos que A es un vector ordenado de m elementos y B es otro vector ordenado de n elementos. La operacin de mezcla producir un nuevo vector de m + n elementos. El mtodo ms sencillo, pero menos eficaz, consiste en colocar una lista detrs de la otra y luego ordenarla. Sin embargo este mtodo no aprovecha la propiedad de que los vectores A y B ya estn ordenados, por ello debe recurrir normalmente al sistema de mezcla el cual cosiste en comparar los dos primeros elementos de los vectores (A y B) y enviar al menor al tercer vector, continuando con el elemento comparado pero no enviado con el siguiente elemento del vector que contiene al elemento menor comparado anteriormente y as sucesivamente. Una vez que se terminaron los elementos de un vector, se procede a vaciar los elementos restantes del otro vector.

m=tamao del vector1 n=tamao del vector2


int m,n,i=0,j=0,k=0,p; while( i < m && j < n ) { if( vec1[i] <= vec2[j] ) { mezcla[k]=vec1[i]; i++; } else { mezcla[k]=vec2[j]; j++; } k++; } if( i>= m) { for( p=j; p < n; p++) { mezcla[k]=vec2[p]; k++; } } if( j>=n ) { for( p=i; p < m; p++ ) { mezcla[k]=vec1[p]; k++; } }

Distribucin Simple
Ordena el vector tomando cada nmero e insertndolo en la posicin que toma su valor, es decir, tengo un cinco en el arreglo; lo pongo en la posicin cinco, algo as como: "lo que valgas en esa posicin te pongo". Por supuesto, no se podrn ordenar los arreglos que tengan valores repetidos y el vector necesita estar del tamao del nmero ms grande que se encuentre en l. Que hacer cuando se repitan los datos? Lo que debemos hacer es incrementar la capacidad de la urna. Para lograrlo podemos hacer lo siguiente: 1.- Definir un arreglo en el que cada posicin puede ser ocupada por mas de un registro (un arreglo de arreglo de registros) puede darse la situacin de ser insuficiente la cantidad de registros adicionales o de existir demasiado desperdicio de memoria. 2.- Definir el tamao de la urna variable a travs del uso de estructuras como las listas simples enlazadas n= Elementos del vector a ordenar b= vector destino a= vector origen for( i=0 ; i < 8 ; i++ ){ b[ a[i] ]=a[i]; }

Radix
El siguiente mtodo que consideramos se denomina ordenamiento de raz. Este ordenamiento se basa en los valores de los dgitos reales en las representaciones de posiciones de los nmeros que se ordenan. Por ejemplo, el numero 235 es en notacin decimal que se escribe con un 2 en la posicin de centenas, un 3 en la posicin de decenas y un 5 en la posicin de unidades. El mas grande de dos enteros de igual longitud se determina del modo siguiente: empezar en el digito mas significativo y avanzar por los dgitos menos significativos mientras coincidan los dgitos correspondientes en los dos nmeros. El numero con el digito mas grande en la primera posicin en la cual los dgitos de los dos nmeros no coinciden es el mayor de los dos. Por supuesto, si coinciden todos los dgitos de ambos nmeros, los nmeros son iguales.

void radixsort ( int x[], int n ){ int front[10], rear[10]; struct{ int info; int next; } node[10]; int exp, first, i, j, k, p, q, y; for(i=0; i < n-1; i++){ node[i].info=x[i]; node[i].next=i+1; } node[n-1].info=x[n-1]; node[n-1].next= -1; firts=0; for(k=1; k < 5 ;k++) { for(i=0;i<10;i++){ rear[i]= -1; front[i]=-1; } while(first!= -1){ p=first; first=node[first].next; y=node[p].info; exp=pow(10,k-1); j=(y/exp)%10; q=rear[j];

if(q = = -1) front[j]=p; else node[q].next=p; rear[j]=p; } for(j=0; j < 10 && front[j] = = -1; j++); ; first=front[j]; while(j<=9){ for(i=j+1; i < 10 && front[i] = = -1; i++); ; if(i<=9){ p=i; node[ rear[ j ] ].next = front[ i ]; } j=i; } node[ rear[ p ] ].next = -1; } for(i=0; i < n; i++){ x[i]= node[first].info; first=node[first].next; } }

El ms sencillo de estos mtodos es la bsqueda secuencial. Esta bsqueda es aplicable a una tabla organizada como una arreglo o como una lista vinculada. Supongamos que vect es un arreglo de n llaves, de vect[0] a vect[n-1], y que x es el valor a buscar, de modo que x es la llave de vect. El algoritmo examina cada llave por turnos. Despus de encontrar una que coincida con el argumento de bsqueda, se retorna su ndice (que funciona como un apuntador o su registro). Si no se encuentra una coincidencia se retorna -1.

Bsqueda Secuencial

int Secuencial ( int x, int vect[] ){ int j=0; for( j=0; j < n; j++ ) if( x = = vect[j] ) return j; return (-1); }

Bsqueda Binaria
El mtodo mas eficiente de bsqueda en una tabla secuencial sin utilizar ndices o tablas auxiliares es la bsqueda binaria. Para poder llevarse acabo esta, necesita tener el arreglo ordenado. Bsicamente, el argumento se compara con la llave del elemento intermedio de la tabla. Si son iguales, la bsqueda termina exitosamente; en caso contrario, debe buscarse en la mitad superior o inferior en la tabla en una forma similar. int Buscar( int vect[]){ int num, cen; izq=0; der=n-1; izq < = der ){ cen=( izq + der )/2; if( vect[cen] = = num ) return cen; if( num > vect[cen] ) izq=cen+1; else der=cen-1; } return (-1); num, int izq,der, while(

La bsqueda binaria proporciona un medio para reducir el tiempo requerido para buscar en una lista. ste mtodo; sin embargo, exige que los datos estn ordenados y siempre depende de el nmero n de elementos del conjunto de datos. Existe otro mtodo que puede aumentar la velocidad de bsqueda donde los datos no necesitan estar ordenados y esencialmente es independiente del nmero n. Este mtodo se conoce como transformacin de claves (clave- direccin) o hashing. El hashing consiste en convertir el elemento almacenado (numrico o alfanumrico) en una direccin (ndice) dentro del array. La idea general de usar la clave para determinar la direccin del registro es una excelente idea, pero se debe modificar de forma que no se desperdicie tanto espacio. Esta modificacin se lleva a cabo mediante una funcin que transforma la clave en un ndice de una tabla y que se denomina funcin de randomizacin o Hash. Si H es una funcin hash y X es un elemento a almacenar, entonces H(X) es la funcin Hash del elemento y se corresponde con el ndice donde se debe colocar X. En nuestro ejemplo, la funcin hash sera H(X) = X % 1000 Los valores generados por H deben cubrir todo el conjunto de ndices de la tabla.

Bsqueda por Hash

n= nmero de elementos en el vector x= valor a buscar void Hashing(){ int d=0,dx=0; d=( x%n)+1; if(a[d] = = x ) printf("valor encontrado"); else{ dx = d + 1; while( (d < n) && (a[dx] != x) && (a[dx] != 0) && (dx != d) ){ dx = dx + 1; if(dx = = n) dx = 1;
}

} }

Anda mungkin juga menyukai