metodos de ordenamiento

7

Click here to load reader

Upload: memoralesiue

Post on 18-Jun-2015

3.781 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Metodos de ordenamiento

INSTITUCIÓN UNIVERSITARIA DE ENVIGADO FACULTAD DE INGENIERÍAS – LÓGICA DE PROGRAMACIÓN

MÉTODOS DE ORDENACIÓN

Se dividen en dos categorías:

Ordenación INTERNA de vectores y matrices (tablas): se denomina ordenación interna, ya que se almacena en la memoria interna de la computadora de gran velocidad y acceso aleatorio.

Ordenación EXTERNA de archivos: La ordenación de archivos se suele hacer con casi siempre sobre soportes de almacenamiento externo, discos, cinta, etc. y por ello se denomina también ordenación externa. Estos dispositivos son más lentos en las operaciones de entrada/salida, pero, por el contrario, pueden contener mayor cantidad de información

ORDENACIÓN DE VECTORES O ARREGLOS:

Los métodos más conocidos son:

1. Ordenación por Intercambio o de burbuja. 2. Ordenación por Inserción directa. 3. Ordenación por Inserción Binaria. 4. Ordenación por Selección Directa. 5. Ordenación por el método de Shell 6. Ordenación por el método Quicksort (ordenamiento rápido)

La organización de los datos en un vector puede ser en orden ascendente (los valores van de menor a mayor) o descendente (los valores van de mayor a menor)

1. Burbuja. El algoritmo ordena los elementos del arreglo utilizando el método de la

burbuja, esto es, transporta en cada pasada el elemento mayor hacia la parte derecha del arreglo.

Ejemplo: Se tiene un vector de 100 elementos, organizarlo de forma ascendente. Lista de variables VEC = nombre del arreglo N = Registro identificador i, J= subíndices del vector AUX = variable auxiliar para ordenar el vector INICIO BURBUJA Inicio

Const Int N = 100; Int VEC[N], num; Int i;

Page 2: Metodos de ordenamiento

Llamar Llenar_VEC (VEC [N], i); Llamar a Ordenar (VEC [N], i);

Fin // Sólo haremos el subprograma Ordenar: Ordenar (Int VEC [N]; Int i)

Inicio Int j, aux;

Para ( i = 1, (n-1)) j = i + 1 Para (J = ( i + 1); N) Si (VEC[ i ] > VEC[ j ]) Ent //Intercambio:

aux = VEC [i]; VEC [i] = VEC[j]; VEC[j] = aux; Fin-si Fin-Para Fin-Para

Fin

2. Ordenamiento Por Inserción directa: En este método una vez que se determina la posición correcta del elemento, se interrumpen las comparaciones.

Ejemplo Ordenar un vector de 100 posiciones con elementos numéricos enteros. Lista de variables VEC = nombre del arreglo N = Registro identificador k, m= subíndices del vector AUX = variable auxiliar para ordenar el vector INSERCION_DIRECTA () Inicio

Const Int N = 100; Int VEC[N], num; Int k; Llamar Llenar_VEC (VEC [N], k); Llamar a Ordenar (VEC [N], k);

Fin // Sólo haremos el subprograma Ordenar: Ordenar (Int VEC [N]; Int k)

Inicio Int m, aux; PARA (k = 2, N)

aux = VEC[m]

Page 3: Metodos de ordenamiento

k = m - 1 MQ ( (k >=1) && (aux < VEC[k]) ) HAGA VEC [k+1] = VEC[k] k = k - 1 Fin-MQ VEC [k+1] = aux;

Fin-Para FIN Ordenar

3. Ordenamiento Por Inserción Binaria: El método de ordenación por inserción directa puede mejorarse fácilmente. Para ello se recurre a una búsqueda binaria en lugar de una búsqueda secuencial para insertar un elemento en la parte izquierda del arreglo, que ya se encuentra ordenado. El proceso, al igual que en método de inserción directa, se repite desde el segundo hasta el n-ésimo elemento.

Ejemplo Ordenar un vector de 100 posiciones con elementos numéricos enteros Lista de variables VEC = nombre del arreglo N = Registro identificador x, y= subíndices del vector AUX = variable auxiliar para ordenar el vector IZQ = izquierda del vector DER = derecha del vector M = variable para almacenar la mitad INSERCION_BINARIA () Inicio

Const Int N = 100; Int VEC[N], num; Int x; Llamar Llenar_VEC (VEC [N], x); Llamar a Ordenar (VEC [N], x);

Fin // Sólo haremos el subprograma Ordenar: Ordenar (Int VEC [N]; Int x)

Inicio Int AUX , IZQ, DER , M, y; Para (y = 2, N) AUX = VEC [y];

IZQ = 1 DER = y - 1 MQ (IZQ <= DER)

M = ((IZQ + DER)/2)

Page 4: Metodos de ordenamiento

SI (AUX < = VEC [M]) Ent DER = M - 1 SINO IZQ = M + 1 FIN-SI

Fin-MQ x = y - 1 MQ (x >= IZQ) HAGA VEC [x + 1] = VEC [x] x = x - 1 Fin-MQ VEC [IZQ] = AUX

Fin-PARA Fin-Ordenar

NOTA: en el método de ordenación por inserción binaria se efectúa el menor número de comparaciones cuando el arreglo está totalmente desordenado y el máximo cuando está ordenado.

4. Ordenamiento Por Selección Directa: El método de ordenación por selección

directa es más eficiente que los métodos analizados anteriormente, pero sólo para vectores pequeños.

La idea básica de este algoritmo consiste en 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 lo coloca en la segunda posición. El método se basa en los siguientes principios:

Seleccionar el menor elemento del arreglo

Intercambiar dicho elemento con el primero

Repetir los pasos anteriores con los (n-1), (n-2) elementos y así sucesivamente hasta que sólo quede el elemento mayor.

Ejemplo Ordenar un vector de 100 posiciones con elementos numéricos enteros Lista de variables VEC = nombre del arreglo N = Registro identificador j, p= subíndices del vector MENOR = variable auxiliar para ordenar el vector K = izquierda del vector ORDENASELECCIONDIRECTA () Inicio

Page 5: Metodos de ordenamiento

Const Int N = 100; Int VEC[N], num; Int j; Llamar Llenar_VEC (VEC [N], j); Llamar a Ordenar (VEC [N], j);

Fin // Sólo haremos el subprograma Ordenar: Ordenar (Int VEC [N]; Int j)

Inicio Int j, MENOR, K, P; PARA (P = 1, N -1)

MENOR = VEC [P] K = P PARA (j = P + 1, N) SI VEC [j] < MENOR) Ent MENOR = VEC [j] K = j Fin-si

Fin-Para VEC [K] = VEC [P] VEC [P] = MENOR

Fin-para Fin

5. Ordenamiento Por El Método De Shell. Es una mejora del método de inserción directa que se utiliza cuando el número de elementos a ordenar es grande. El método se denomina “Shell” -en honor a su inventor Donal Shell- y también método de inserción sin incrementos decrecientes.

Shell modificó los saltos contiguos resultantes de las comparaciones por saltos de mayor tamaño y con eso se conseguía la clasificación más rápida. El método se basa en fijar el tamaño de los saltos constantes, pero de más de una posición.

Supongamos un vector A de seis (6) elementos.

4 12 16 24 36 3

En el método de inserción, los saltos se hacen de una posición y se necesitarán 5 comparaciones. En el método de Shell, si los saltos son de dos posiciones, se realiza tres comparaciones.

El método se basa en tomar como salto N/2 (siendo N el número de elementos) y luego se va reduciendo a la mitad en cada repetición hasta que el salto o distancia vale 1

Page 6: Metodos de ordenamiento

Para un vector A de N elementos, el primer salto a dar tendrá un valor de N/2, por lo que, para redondear, se tomará la parte entera de N div 2

Y se iguala a SALTO Salto = N div 2

El seudocódigo del procedimiento de ordenamiento por el método Shell es el siguiente: Ejemplo Ordenar los elementos del arreglo utilizando el método de Shell. VEC es un arreglo de 100 elementos Lista de variables VEC = nombre del arreglo N = Registro identificador J,K,F = subíndices del vector SALTO = variable auxiliar para ordenar el vector ORDENAMIENTO_SHELL () Inicio

Const Int N = 100; Int VEC[N], num; Int j; Llamar Llenar_VEC (VEC [N], j); Llamar a Ordenar (VEC [N], j);

Fin // Sólo haremos el subprograma Ordenar: Ordenar (Int VEC [N]; Int j)

Inicio Int SALTO, K, F; SALTO = N div 2

MQ (SALTO > 0) HAGA PARA (F = (SALTO + 1), N) J = F - SALTO Mq (J > 0) K = J + SALTO SI (VEC [J] <= VEC [K]) Ent J = 0 SINO AUX = VEC [j] VEC [j] = VEC [k] VEC [k] = AUX Fin-si J = J - SALTO Fin-MQ

Page 7: Metodos de ordenamiento

Fin-Para SALTO = SALTO div 2 Fin-MQ

Fin Ordenar

TALLER DE ORDENAMIENTO:

1. Almacenar 50 números en un vector, ordenarlos en forma ascendente y mostrar si

existe o no un número leído desde teclado.

2. Almacenar en vectores paralelos de 50 posiciones, los nombres y cédulas de los

estudiantes de un grupo. Permitir realizar consultas por el número de cédula y

mostrar los vectores ordenados en forma descendente.

3. Almacenar en vectores paralelos el código y precio de N artículos, máximo 100.

Permitir consultas por código y por precio. Mostrarlos ordenados en forma

ascendente por el campo código.

4. Almacenar en vectores paralelos de 100 posiciones los datos de N estudiantes:

código y promedio académico. Permitir consultar por código del estudiante.

Mostrar los vectores ordenados por el campo código y/o promedio de acuerdo a la

elección del usuario.

5. Almacenar en vectores paralelos (igual tamaño) la edad y el sexo de 100 personas.

Imprimir el promedio de edad de los hombres y promedio de edad de las mujeres.

Mostrar el contenido de ambos vectores en forma ordenada por el campo edad.