Metodos De Ordenamiento Interno ( En Memoria Principal).

20
MÉTODOS DE ORDENAMIENTO INTERNO (EN MEMORIA PRINCIPAL) Para todos los algoritmos se cuenta con la siguiente estructura de datos Const MAX = 100 A = arreglo[1..MAX] de enteros Variable N:entero ORDENAMIENTO DIRECTO. MÉTODO DE BURBUJA. Ordena los elementos del arreglo usando el método de burbuja. Transporta en cada pasada el elemento más pequeño a la parte izquierda del arreglo A de N elementos. Burbuja1(A,N) Inicio Declarar i,j,aux:entero Para i 2 hasta N haga Para j i hasta 2 inc (–1) haga Si (A[j-1]>A[j]) entonces Aux A[j-1] A[j-1] A[j] A[j] aux Fin si Fin para Fin para Fin ORDENAMIENTO DIRECTO. METODO DE LA BURBUJA. CONTRARIO AL ANTERIOR.

Transcript of Metodos De Ordenamiento Interno ( En Memoria Principal).

Page 1: Metodos De Ordenamiento Interno ( En Memoria Principal).

MÉTODOS DE ORDENAMIENTO INTERNO (EN MEMORIA PRINCIPAL)

  Para todos los algoritmos se cuenta con la siguiente estructura de datos  Const MAX = 100A = arreglo[1..MAX] de enterosVariable N:entero  ORDENAMIENTO DIRECTO. MÉTODO DE BURBUJA.Ordena los elementos del arreglo usando el método de burbuja. Transporta en cada pasada el elemento más pequeño a la parte izquierda del arreglo A de N elementos. 

Burbuja1(A,N)Inicio            Declarar i,j,aux:entero            Para i 2 hasta N haga                        Para j i hasta 2 inc (–1) haga                                   Si (A[j-1]>A[j]) entonces                                               Aux A[j-1]                                               A[j-1] A[j]                                               A[j] aux                                   Fin si                        Fin para            Fin paraFin

ORDENAMIENTO DIRECTO. METODO DE LA BURBUJA. CONTRARIO AL ANTERIOR.La lógica de este algoritmo cambia con el anterior, en el hecho de que en cada pasada se lleva el valor mas grande a hacia la parte derecha del arreglo A de N elementos.

Burbuja2(A,N)Inicio            Declarar i,j,aux:entero            Para i 1 hasta N-1 haga                        Para j 1 hasta N-i haga                                   Si (A[j]>A[j+1]) entonces                                               Aux A[j]                                               A[j] A[j+1]                                               A[j+1] aux                                   Fin si                        Fin para            Fin paraFin

Page 2: Metodos De Ordenamiento Interno ( En Memoria Principal).

ORDENAMIENTO DIRECTO CON SEÑAL

Algoritmo que usa el principio de ordenamiento del método de la burbuja, usando una señal para saber si en cada pasada hubo intercambios. Arreglo A de N elementos enteros.

Burbujaconseñal(A, N)Inicio            Declarar i,j,aux:entero            Declarar band:booleano            i 1             Band FALSO             Mientras Que (i<= N-1) y (band = FALSO) haga                        Band VERDADERO                        Para j 1 hasta N-i haga                                   Si (A[j]>A[j+1]) entonces                                               Aux A[j]                                               A[j] A[j+1]                                               A[j+1] aux                                               Band FALSO                                   Fin si                        Fin para            Fin MQFin

ORDENAMIENTO POR EL MÉTODO DE LA SACUDIDA (SHAKER SORT)

Este método es una optimización del método de la burbuja. Consiste en mezclar las dos formas como se puede realizar el método de ordenamiento directo. En cada pasada hay dos etapas, el la primera etapa se trasladan los elementos más pequeños hacia la izquierda almacenando en una variable el último elemento intercambiado. En la segunda etapa, se trasladan los elementos más grandes hacia la parte derecha del arreglo almacenando en otra variable la posición del último elemento intercambiado.Algoritmo que ordena los elementos del arreglo A, de N elementos, por el método de la sacudida.

Shakersort(A,N) Inicio            Declarar i, izq, der, k, aux: entero            izq 2            der N            k N            Repetir                         Para i der hasta izq inc (-1) haga                                   Si (A[i-1]>A[i]) entonces                                               Aux A[i-1]                                                A[i-1] A[i]

Page 3: Metodos De Ordenamiento Interno ( En Memoria Principal).

                                               A[i] aux                                                k i                                   Fin si                        Fin para                        Izq k + 1                        Para i izq hasta der haga                                   Si (A[i-1] > A[i]) entonces                                               Aux A[i-1]                                                A[i-1] A[i]                                                A[i] Aux                                                k i                                    Fin si                         Fin para                         Der k-1             Hasta que izq>derFin

METODO DE ORDENAMIENTO POR INSERCIÓN DIRECTA

El objetivo de este método es copiar la forma como los jugadores de cartas ordenan la baraja en una mano. El objetivo de este método es insertar un elemento en la parte izquierda del arreglo que ya se encuentra ordenada. El proceso se repite desde el segundo hasta el n-esimo elemento.Algoritmo que ordena los elementos del arreglo usando el método de inserción directa. Arreglo A de N elementos.

insercion(A,N)Inicio            Declarar i, aux, k: entero            Para i 2 hasta N haga                        Aux A[i]                         k i-1                        Mientras Que ((k>=1) y (aux<A[k])) haga                                   A[k+1] A[k]                                   k k -1                        Fin MQ                        A[k+1] aux            Fin paraFin

Page 4: Metodos De Ordenamiento Interno ( En Memoria Principal).

ORDENAMIENTO POR MÉTODO DE INSERCIÓN BINARIA

Es una mejora del método de inserción directa, ya que se hace una búsqueda binaria en lugar de una búsqueda secuencial para insertar el elemento a la izquierda del arreglo, que ya se encuentra ordenado. Y el proceso se repite hasta el n-esimo elemento.Algoritmo que ordena los elementos del arreglo usando el método de inserción binara. Arreglo A de N elementos.

insercionbinaria(A,N)Inicio            Declarar i, aux, izq, der, m, j: entero            Para i 2 hasta N haga                        Aux A[i]                         Izq 1                         Der i-1                         Mientras Que (izq<=der) haga                                   m parteentera((izq+der)/2)                                   Si (aux <= A[m]) entonces                                               Der m-1                                   Sino                                               Izq m+1                                   Fin si                        Fin MQ                        j i-1                        Mientras Que (j>=izq) haga                                   A[j+1] A[j]                                   j j-1                        Fin MQ                        A[izq] aux            Fin paraFin

ORDENAMIENTO POR SELECCIÓN DIRECTA

La idea de este algoritmo es buscar el menor elemento del arreglo y colocarlo en la primera posición, luego se busca el segundo elemento más pequeño del arreglo y se coloca en la segunda posición y así. El algoritmo se basa en:

1. Seleccionar el menor elemento del arreglo. 2. Intercambiar dicho elemento con el primero. 3. Repetir los pasos anteriores con los (n-1), (n-2)... elementos y así sucesivamente

hasta que solo quede el elemento mayor. Algoritmo que ordena los elementos de un arreglo usando el método de selección directa. A arreglo de N elementos.

Page 5: Metodos De Ordenamiento Interno ( En Memoria Principal).

seleccion(A,N)Inicio            Declarar i, menor, k, j: entero            Para i 1 hasta N-1 haga                        Menor A[i]                         k i                         Para j i+1 hasta N haga                                   Si (A[j]<menor) entonces                                               Menor A[j]                                               k j                                   Fin si                        Fin para                        A[k] A[i]                         A[i] menor             Fin paraFin

 

COMPARACIÓN DE LOS MÉTODOS DIRECTOS DE ORDENAMIENTO

Método item Ordenada Desordenada Orden Inverso

IntercambioDirecto

comp.

Mov 0

InserciónDirecta

comp.

Mov 0

SelecciónDirecta

comp.

Mov ORDENAMIENTO CON EL MÉTODO DE SHELL (INSERCIÓN CON INCREMENTOS DECRECIENTES)

Este algoritmo compara cada elemento del arreglo para su ubicación correcta, con los elementos que se encuentran en la parte izquierda del mismo. Este método propone que las comparaciones entre los elementos se efectúen con saltos de mayor tamaño, pero con incrementos decrecientes.Algoritmo que ordena los elementos de un arreglo usando el método de shell. A arreglo de N elementos.

Page 6: Metodos De Ordenamiento Interno ( En Memoria Principal).

shell(A,N) Inicio            Declarar int, i, aux: entero            Declarar band: booleano            Int N+i            Mientras Que (int>1) haga                        int parteentera(int/2)                         band VERDADERO                         Mientras Que (band=VERDADERO) haga                                   Band FALSO                                      i 1                                   Mientras Que ((I+int)<=N) haga                                               Si (A[i]>A[i+int]) entonces                                                           aux A[i]                                                            A[i] A[i+int]                                                            A[i+int] aux                                                            Band VERDADERO                                               Fin si                                                i i+1                                    Fin MQ                         Fin MQ            Fin MQFin

ORDENAMIENTO POR EL MÉTODO DE QUICKSORT (MÉTODO RÁPIDO DE ORDENACIÓN POR PARTICIÓN)

Este algoritmo es el mas eficiente y veloz de los métodos de ordenación interna. La idea central del algoritmo es:

1. Se toma un elemento X de una posición cualquiera del arreglo 2. Se trata de ubicar a X en la posición de correcta del arreglo, de tal forma que todos

los elementos que se encuentran a su izquierda sean menores o iguales a X y todos los elementos que se encuentran a su derecha sean mayores o iguales a X.

3. Se repiten los pasos anteriores, pero con los conjuntos de datos que se encuentran a la izquierda y a la derecha de la posición correcta de X en el arreglo.

4. El proceso termina cuando todos los elementos se encuentran en su posición correcta en el arreglo.

El paso 3 se puede hacer de forma iterativa o recursiva. En este ejemplo, se hará de forma iterativa, dejando el método recursivo para más adelante en el curso.Se necesitan dos algoritmos. Quicksortitera y reduceitera.Algoritmo que ordena los elementos de un arreglo A de N elementos, usando el método Quicksort iterativo.

Page 7: Metodos De Ordenamiento Interno ( En Memoria Principal).

Quicksortitera(A, N)Inicio            Declarar top, ini, fin, pos: entero            Pilamayor: Arreglo[1..MAX] de entero            Pilamenor: Arreglo[1..MAX] de entero              Top 1            Pilamenor[top] 1            Pilamayor[top] N            Mientras Que (top>0) haga                        Ini pilamenor[top]                        Fin pilamayor[top]                        Top top-1                        Pos Reduceitera(ini, fin)                        Si (ini<(pos-1)) entonces                                   Top top+1                                   Pilamenor[top] ini                                   Pilamayor[top] pos-1                        Fin si                        Si (fin>(pos+1)) entonces                                   Top top+1                                   Pilamenor[top] pos+1                                   Pilamayor[top] fin                        Fin si            Fin MQFin

 Reduceitera(INI, FIN)/* INI y FIN representa las posiciones de los extremos izquierdo y derecho respectivamente del conjunto de elementos a evaluar. En POS es una variable donde se almacenará el resultado de este algoritmo */Inicio            Declarar izq, der, aux, pos: entero            Declarar band: booleano                       Izq ini            Der fin            Pos ini            Band VERDADERO            Mientras Que (band=VERDADERO) haga                        Mientras Que ((A[pos]<=A[der]) y (pos<>der)) haga                                   der der-1                        Fin MQ                        Si (Pos=der) entonces                                   Band FALSO                         Sino

Page 8: Metodos De Ordenamiento Interno ( En Memoria Principal).

                                   Aux A[pos]                                   A[pos] A[der]                                   A[der] aux                                   Pos der                                   Mientras Que ((A[pos]>=A[izq])y(pos<>izq)) haga                                               Izq izq+1                                   Fin MQ                                   Si (pos=izq) entonces                                               Band Falso                                   Sino                                               Aux A[pos]                                               A[pos] A[izq]                                               A[izq] aux                                               Pos izq                                   Fin si                        Fin si            Fin MQ            Retornar PosFin

Arriba    Presentación

MÉTODOS DE BÚSQUEDA INTERNA (BÚSQUEDA EN MEMORIA PRINCIPAL)  Para todos los algoritmos se cuenta con la siguiente estructura de datos  Const MAX = 100V = arreglo[1..MAX] de enterosVariable N: entero  Existen 4 métodos principales de búsqueda interna:         Secuencial líneal         Binaria         Por transformación de Claves (Solo se menciona, después se añadirán los algoritmos)         Árboles de búsqueda (no se tratan aquí)  BÚSQUEDA SECUENCIAL LINEAL.Consiste en la revisión elemento por elemento del arreglo hasta encontrar el dato buscado, o hasta llegar al final del arreglo, sin haberlo encontrado. Se puede diferenciar entre buscar en un arreglo desordenado y buscar en un arreglo ordenado.  Búsqueda en arreglos desordenadosAlgoritmo que busca secuencialmente el elemento X en el arreglo desordenado V, con N elementos.

Page 9: Metodos De Ordenamiento Interno ( En Memoria Principal).

Secuencialdesordenado(V, N, X)Inicio            Declarar i:entero            Declarar bandera: booleano              i 1            Bandera FALSO            Mientras Que ((i<=N) y (Bandera=FALSO)) haga                        Si (V[i]=X) entonces                                   Bandera VERDADERO                        Sino                                   i i+1                        Fin si            Fin MQ            Si (bandera=VERDADERO) entonces                        Imprimir(“El elemento está en la posición i”);            Sino                        Imprimir(“El elemento no está en el arreglo”)            Fin siFin

Búsqueda en arreglos ordenadosEste algoritmo es similar al anterior, pero se agrega una nueva condición basada en el orden de los elementos. Busca secuencialmente un elemento X en un arreglo ordenado V de N elementos. El orden de V es creciente. {V[1]≤V[2] ≤...≤V[N]}

Secuencialordenado(V, N, X)Inicio            Declarar i:entero            Declarar bandera: booleano              i 1            Bandera FALSO            Mientras Que ((i<=N) y (Bandera=FALSO) y (X>=V[i]) haga                        Si (X=V[i]) entonces                                   Bandera VERDADERO                        Sino                                   i i+1                        Fin si            Fin MQ            Si (bandera=VERDADERO) entonces                        Imprimir(“El elemento está en la posición i”);            Sino                        Imprimir(“El elemento no está en el arreglo”)            Fin siFin

Page 10: Metodos De Ordenamiento Interno ( En Memoria Principal).

BÚSQUEDA BINARIA

La búsqueda binaria, sirve exclusivamente para arreglos ordenados, consiste en dividir el intervalo de búsqueda en dos partes, comparando el elemento buscado con el central, , en caso de no ser iguales se redefinen los extremos del intervalo (según si el elemento central es mayor o menor que el buscado). El proceso termina cuando se encuentra el elemento o cuando se anula el intervalo de búsqueda.Algoritmo que busca el elemento X mediante búsqueda binaria en el arreglo ordenado V con N elementos.

binaria(V, N, X)Inicio            Declarar izq, cen, der: entero            Declarar bandera: booleano              Izq 1            Der N            Bandera FALSO            Mientras Que ((izq<=der) y (Bandera=FALSO)) haga                        Cen parteentera((izq+der)/2)                        Si (X=V[cen]) entonces                                   Bandera VERDADERO                        Sino                                    Si (X>V[cen]) entonces                                               izq cen+1                                    Sino                                                der cen-1                                    Fin si                         Fin si            Fin MQ            Si (bandera=VERDADERO) entonces                        Imprimir(“El elemento está en la posición cen”);            Sino                        Imprimir(“El elemento no está en el arreglo”)            Fin siFin

 

Page 11: Metodos De Ordenamiento Interno ( En Memoria Principal).

MÉTODO DE TRANSFORMACIÓN DE CLAVES

Este método permite asignar a un valor una posición determinada de un arreglo (no necesariamente secuencial y a veces independiente de su valor) y de igual forma permite recuperarla fácilmente. Presenta dos momentos principales. El primero consiste en la aplicación de una función de transformación o función hash a los valores que se van a insertar, para saber en que posición del arreglo quedarán. La función hash debe ser simple de calcular y debe asignar direcciones de la manera mas uniforme posible. La segunda alivia el hecho de que dos valores distintos sean asignados a la misma dirección del arreglo por causa de la función hash, hecho que se conoce como colisión. Es decir, el segundo momento es la recuperación de colisiones y consiste en como reasignar y recuperar un valor que por motivo de la función hash quede en la misma posición de otro. Para asignar funciones hash, existen varios métodos:Función módulo: Consiste en tomar el residuo de la división de la clave entre el número de componentes del arreglo. H(k) = (K mod N) +1. Para lograr una mayor uniformidad en la distribución, N debe ser un número primo. (El número primo próximo a N).Función cuadrado: Consiste en elevar al cuadrado la clave y tomar los dígitos centrales como dirección. H(k) = digitos_centrales(K2)+1.Función plegamiento:  Consiste en dividir la clave en partes de igual número de dígitos (La última puede tener menos dígitos) y operar con ellos tomando como dirección los dígitos menos significativos. La operación entre las partes puede hacerse por medio de sumas o multiplicaciones. H(k) = digitos_menos_significativos((d1..di)+(di+1..dj)+...+(dl..dn))+1Función Truncamiento: Consiste en tomar algunos de la clave y formar con ellos una dirección. Este método es de los más sencillos, pero es también de los que ofrece menos uniformidad en la distribución de las claves. Se pueden elegir los dígitos de las posiciones pares o impares. H(k) = elegirdigitos(d1,d2,...,dn)+1El método de resolución de colisiones es tan importante como la elección de una buena función hash. El tratamiento de las colisiones es costoso, por esto, es que debe hacerse un esfuerzo por encontrar una función hash que ofrezca mayor uniformidad en la distribución de las claves. Los métodos de solución de colisiones son también variados:Reasignación:   Se trabaja bajo el principio de comparación y reasignación de elementos.          Prueba lineal: Consiste en que una vez detectada la colisión se debe recorrer el arreglo

secuencialmente a partir del punto de la colisión, buscando el elemento. El proceso de búsqueda concluye cuando el elemento es hallado, o bien cuando se encuentra una posición vacía. Se trata el arreglo como una estructura circular. Algoritmo que  busca el dato con clave K en el arreglo V de N elementos. Resolución de colisiones  por medio de la prueba lineal.        

Page 12: Metodos De Ordenamiento Interno ( En Memoria Principal).

Pruebalineal(V, N, K) Inicio             Declarar D, Dx: entero                         D H(K)  /* Generar dirección */             Si (V[D]=K) entonces                         Imprimir “El elemento está en la posición D”             Sino                         Dx D+1                         Mientras Que ((Dx<=N) y (V[Dx]<>K) y (V[Dx]<>vacio) y (Dx<>D)) haga                                    Dx Dx+1                                     Si (Dx=(N+1)) entonces                                                Dx 1                                     Fin si                         Fin MQ                         Si (V[Dx]=K) entonces                                     Imprimir(“El elemento está en la posición Dx”)                         Sino                                     Imprimir(“El elemento no está en el arreglo”)                         Fin si             Fin si Fin

             Prueba Cuadrática: Similar al de prueba lineal. La diferencia consiste en que en el cuadrático

las direcciones alternativas se generarán como D+1, D+4, D+9,…, D+i2. Algoritmo que  busca el dato con clave K en el arreglo V de N elementos. Resolución de colisiones  por medio de la prueba lineal.

Pruebacuadratica(V, N, K) Inicio             Declarar D, Dx, i: entero                         D H(K)  /* Generar dirección */             Si (V[D]=K) entonces                         Imprimir “El elemento está en la posición D”             Sino                         i1                                         Dx D+i2                         Mientras Que ((V[Dx]<>K) y (V[Dx]<>vacio)) haga                                    i i+1                                    Dx D+i2                                     Si (Dx>N) entonces                                                i 0                                                 Dx 1                                                D 1                                     Fin si                         Fin MQ                         Si (V[Dx]=K) entonces

Page 13: Metodos De Ordenamiento Interno ( En Memoria Principal).

                                   Imprimir(“El elemento está en la posición Dx”)                         Sino                                    Imprimir(“El elemento no está en el arreglo”)                         Fin si             Fin si Fin

            Doble dirección hash: Consiste en que una vez detectada la colisión se debe generar otra

dirección aplicando la función hash a la dirección previamente obtenida. El proceso se detiene cuando el elemento es hallado, o cuando se encuentra una posición vacía. D = H(K)  D’ = H(D)   D”= H(D’) Algoritmo que  busca el dato con clave K en el arreglo V de N elementos. Resolución de colisiones  por medio de la prueba lineal.

Dobledireccion(V, N, K) Inicio             Declarar D, Dx: entero                         D H(K)  /* Generar dirección */             Si (V[D]=K) entonces                         Imprimir “El elemento está en la posición D”             Sino                         Dx H’(D)                         Mientras Que ((Dx<=N) y (V[Dx]<>K) y (V[Dx]<>vacio) y (Dx<>D)) haga                                    Dx H’(Dx)                         Fin MQ                         Si (V[Dx]=K) entonces                                    Imprimir(“El elemento está en la posición Dx”)                         Sino                                    Imprimir(“El elemento no está en el arreglo”)                         Fin si             Fin si Fin

 

Page 14: Metodos De Ordenamiento Interno ( En Memoria Principal).

Arreglos anidados: Consiste en que cada elemento del arreglo tenga otro arreglo con el cual se almacenan los elementos colisionados. Es una solución sencilla, pero ineficiente. No se analizará por ahora. Encadenamiento: Consiste en que cada elemento del arreglo tenga un apuntador a una lista encadenada, la cual se irá generando e irá almacenando los valores colisionados a medida que se requiera. Es el método más eficiente, pero no se analizará por ahora.