Sunteți pe pagina 1din 44

Algoritmos y Estructura de Datos

IV Ciclo
Ingeniería de Sistemas e Informática

Semana 11: Métodos de Ordenamiento

• Docente: Mg. Ing. Gilberto Carrión Barco


• E-Mail: C14051@utp.edu.pe
Logro de la sesión
 El participante del curso
describe las ventajas y
aplicabilidad de los diferentes
métodos de ordenación de
arreglos.
 Desarrolla ejercicios de
ordenación haciendo uso del
Lenguaje de Progración Java.

Mg. Ing. Gilberto Carrión Barco 2


Contenido
 Introducción
 Algoritmos
 Complejidad
 Ejemplos

Mg. Ing. Gilberto Carrión Barco 3


Introducción
 Ordenación o clasificación es el proceso de reordenar un
conjunto de objetos en un orden específico. El propósito de la
ordenación es facilitar la búsqueda de elementos en el conjunto
ordenado.
 Existen muchos algoritmos de ordenación, siendo la diferencia
entre ellos las ventajas de unos sobre otros en la eficiencia en
tiempo de ejecución.

Mg. Ing. Gilberto Carrión Barco 4


Introducción
 Los métodos de ordenación se pueden clasificar en dos
categorías:
• ordenación de ficheros y
• ordenación de arrays.
 También suele llamarse ordenamiento externo e interno, debido
a que los ficheros se guardan en la memoria externa (lenta)
mientras que los arrays se almacenan en la memoria rápida del
ordenador (interna).

Mg. Ing. Gilberto Carrión Barco 5


Introducción

 El problema del ordenamiento puede establecerse mediante la


siguiente acción:
Dados los elementos: a1 ,a2 ,, an
 Ordenar consiste en permutar esos elementos
en un orden: a ,a , , a k1 k2 kn

tal que dada una función de ordenamiento f:

f (ak1 )  f (ak2 )   f (akn )

Mg. Ing. Gilberto Carrión Barco 6


Introducción
 En lo que sigue se considera que la estructura lineal (array, lista,
vector o secuencia) a ordenar se representa por un array de
objetos (números enteros):
int a[ ] = new int[MAX];
• siendo MAX el número máximo de elementos del array.
 El orden de los elementos después de la ordenación se
considera ascendente.

Mg. Ing. Gilberto Carrión Barco 7


Algoritmo burbuja
 Es un método caracterizado por la comparación e intercambio
de pares de elementos hasta que todos los elementos estén
ordenados.
 En cada iteración se coloca el elemento más pequeño (orden
ascendente) en su lugar correcto, cambiándose además la
posición de los demás elementos del array.

Mg. Ing. Gilberto Carrión Barco 8


Algoritmo burbuja

Datos
originales 1ª iter. 2ª 3ª 4ª

36 6 6 6 6
24 36 10 10 10
10 24 36 12 12
6 10 24 36 24
12 12 12 24 36

Mg. Ing. Gilberto Carrión Barco 9


Algoritmo burbuja

Datos
originales 1ª iter. 2ª 3ª 4ª

36 6 6 6 6
24 36 10 10 10
10 24 36 12 12
6 10 24 36 24
12 12 12 24 36

Mg. Ing. Gilberto Carrión Barco 10


Algoritmo burbuja

Datos
originales 1ª iter. 2ª 3ª 4ª

36 6 6 6 6
24 36 10 10 10
10 24 36 12 12
6 10 24 36 24
12 12 12 24 36

Mg. Ing. Gilberto Carrión Barco 11


Algoritmo burbuja

Datos
originales 1ª iter. 2ª 3ª 4ª

36 6 6 6 6
24 36 10 10 10
10 24 36 12 12
6 10 24 36 24
12 12 12 24 36

Mg. Ing. Gilberto Carrión Barco 12


Algoritmo burbuja

Datos
originales 1ª iter. 2ª 3ª 4ª

36 6 6 6 6
24 36 10 10 10
10 24 36 12 12
6 10 24 36 24
12 12 12 24 36

Mg. Ing. Gilberto Carrión Barco 13


Algoritmo burbuja

for(i=n;i>0;i--) public static void burbuja(int[]matrix){


for(j=0;j<i-1;j++) int temp;
for(int i=1;i < matrix.length;i++)
if (a[j] > a[j+1]){
for (int j=0 ; j < matrix.length- 1; j++) {
Aux=a[j];
if (matrix[j] > matrix[j+1]){
a[j] = a[j+1]; temp = matrix[j];
a[j+1]=Aux; matrix[j] = matrix[j+1];
ninterc++; matrix[j+1] = temp;

} }
}
}

Mg. Ing. Gilberto Carrión Barco 14


Algoritmo inserción

 Este método es usado por los jugadores de cartas. Los


elementos están divididos conceptualmente en una secuencia
destino y una secuencia fuente .
 En cada paso, comenzando con i=2 e incrementando i en uno, el
elemento i-ésimo de la secuencia fuente se toma y se transfiere
a la secuencia destino insertándolo en el lugar adecuado.
 En otras palabras, en el i-ésimo paso insertamos el i-ésimo
elemento a[i] en su lugar correcto entre a[1], a[2],…., a[i-1],
que fueron colocados en orden previamente.

Mg. Ing. Gilberto Carrión Barco 15


Algoritmo inserción

Array
Original: 44 55 12 42 94 18 06 67

i=2 44 55 12 42 94 18 06 67
i=3 12 44 55 42 94 18 06 67
i=4 12 42 44 55 94 18 06 67
i=5 12 42 44 55 94 18 06 67
i=6 12 18 42 44 55 94 06 67
i=7 06 12 18 42 44 55 94 67
i=8 06 12 18 42 44 55 67 94

Mg. Ing. Gilberto Carrión Barco 16


Algoritmo inserción

Array
Original: 44 55 12 42 94 18 06 67

i=2 44 55 12 42 94 18 06 67
i=3 12 44 55 42 94 18 06 67
i=4 12 42 44 55 94 18 06 67
i=5 12 42 44 55 94 18 06 67
i=6 12 18 42 44 55 94 06 67
i=7 06 12 18 42 44 55 94 67
i=8 06 12 18 42 44 55 67 94

Mg. Ing. Gilberto Carrión Barco 17


Algoritmo inserción

Array
Original: 44 55 12 42 94 18 06 67

i=2 44 55 12 42 94 18 06 67
i=3 12 44 55 42 94 18 06 67
i=4 12 42 44 55 94 18 06 67
i=5 12 42 44 55 94 18 06 67
i=6 12 18 42 44 55 94 06 67
i=7 06 12 18 42 44 55 94 67
i=8 06 12 18 42 44 55 67 94

Mg. Ing. Gilberto Carrión Barco 18


Algoritmo inserción

Array
Original: 44 55 12 42 94 18 06 67

i=2 44 55 12 42 94 18 06 67
i=3 12 44 55 42 94 18 06 67
i=4 12 42 44 55 94 18 06 67
i=5 12 42 44 55 94 18 06 67
i=6 12 18 42 44 55 94 06 67
i=7 06 12 18 42 44 55 94 67
i=8 06 12 18 42 44 55 67 94

Mg. Ing. Gilberto Carrión Barco 19


Algoritmo inserción

Array
Original: 44 55 12 42 94 18 06 67

i=2 44 55 12 42 94 18 06 67
i=3 12 44 55 42 94 18 06 67
i=4 12 42 44 55 94 18 06 67
i=5 12 42 44 55 94 18 06 67
i=6 12 18 42 44 55 94 06 67
i=7 06 12 18 42 44 55 94 67
i=8 06 12 18 42 44 55 67 94

Mg. Ing. Gilberto Carrión Barco 20


Algoritmo inserción

Array
Original: 44 55 12 42 94 18 06 67

i=2 44 55 12 42 94 18 06 67
i=3 12 44 55 42 94 18 06 67
i=4 12 42 44 55 94 18 06 67
i=5 12 42 44 55 94 18 06 67
i=6 12 18 42 44 55 94 06 67
i=7 06 12 18 42 44 55 94 67
i=8 06 12 18 42 44 55 67 94

Mg. Ing. Gilberto Carrión Barco 21


Algoritmo inserción

Array
Original: 44 55 12 42 94 18 06 67

i=2 44 55 12 42 94 18 06 67
i=3 12 44 55 42 94 18 06 67
i=4 12 42 44 55 94 18 06 67
i=5 12 42 44 55 94 18 06 67
i=6 12 18 42 44 55 94 06 67
i=7 06 12 18 42 44 55 94 67
i=8 06 12 18 42 44 55 67 94

Mg. Ing. Gilberto Carrión Barco 22


Algoritmo inserción

Array
Original: 44 55 12 42 94 18 06 67

i=2 44 55 12 42 94 18 06 67
i=3 12 44 55 42 94 18 06 67
i=4 12 42 44 55 94 18 06 67
i=5 12 42 44 55 94 18 06 67
i=6 12 18 42 44 55 94 06 67
i=7 06 12 18 42 44 55 94 67
i=8 06 12 18 42 44 55 67 94

Mg. Ing. Gilberto Carrión Barco 23


Algoritmo inserción

for(i=1;i<n;i++) { public static void Insercion (int[] vector) {


j=i-1; for (int i=1; i < vector.length; i++) {
t=a[i]; int aux = vector[i];
while (j>=0 && t<a[j]) { int j;
a[j+1] = a[j]; for (j=i-1; j>=0 && vector[j]>aux; j--){
j=j-1; vector[j+1] = vector[j];
} }
a[j+1]=t; vector[j+1] = aux;
} }
}

Mg. Ing. Gilberto Carrión Barco 24


Algoritmo selección

 En éste método, en el i-ésimo paso seleccionamos el elemento


con la llave de menor valor, entre a[i],…, a[n] y lo
intercambiamos con a[i].
 Como resultado, después de i pasadas, el i-ésimo elemento
menor ocupará a[1],…, a[i] en el lugar ordenado.

Mg. Ing. Gilberto Carrión Barco 25


Algoritmo selección

Array
original: 44 55 12 42 94 18 06 67

i=2 06 55 12 42 94 18 44 67
i=3 06 12 55 42 94 18 44 67
i=4 06 12 18 42 94 55 44 67
i=5 06 12 18 42 94 55 44 67
i=6 06 12 18 42 44 55 94 67
i=7 06 12 18 42 44 55 94 67
i=8 06 12 18 42 44 55 67 94

Mg. Ing. Gilberto Carrión Barco 26


Algoritmo selección

Array
original: 44 55 12 42 94 18 06 67

i=2 06 55 12 42 94 18 44 67
i=3 06 12 55 42 94 18 44 67
i=4 06 12 18 42 94 55 44 67
i=5 06 12 18 42 94 55 44 67
i=6 06 12 18 42 44 55 94 67
i=7 06 12 18 42 44 55 94 67
i=8 06 12 18 42 44 55 67 94

Mg. Ing. Gilberto Carrión Barco 27


Algoritmo selección

Array
original: 44 55 12 42 94 18 06 67

i=2 06 55 12 42 94 18 44 67
i=3 06 12 55 42 94 18 44 67
i=4 06 12 18 42 94 55 44 67
i=5 06 12 18 42 94 55 44 67
i=6 06 12 18 42 44 55 94 67
i=7 06 12 18 42 44 55 94 67
i=8 06 12 18 42 44 55 67 94

Mg. Ing. Gilberto Carrión Barco 28


Algoritmo selección

Array
original: 44 55 12 42 94 18 06 67

i=2 06 55 12 42 94 18 44 67
i=3 06 12 55 42 94 18 44 67
i=4 06 12 18 42 94 55 44 67
i=5 06 12 18 42 94 55 44 67
i=6 06 12 18 42 44 55 94 67
i=7 06 12 18 42 44 55 94 67
i=8 06 12 18 42 44 55 67 94

Mg. Ing. Gilberto Carrión Barco 29


Algoritmo selección

Array
original: 44 55 12 42 94 18 06 67

i=2 06 55 12 42 94 18 44 67
i=3 06 12 55 42 94 18 44 67
i=4 06 12 18 42 94 55 44 67
i=5 06 12 18 42 94 55 44 67
i=6 06 12 18 42 44 55 94 67
i=7 06 12 18 42 44 55 94 67
i=8 06 12 18 42 44 55 67 94

Mg. Ing. Gilberto Carrión Barco 30


Algoritmo selección

Array
original: 44 55 12 42 94 18 06 67

i=2 06 55 12 42 94 18 44 67
i=3 06 12 55 42 94 18 44 67
i=4 06 12 18 42 94 55 44 67
i=5 06 12 18 42 94 55 44 67
i=6 06 12 18 42 44 55 94 67
i=7 06 12 18 42 44 55 94 67
i=8 06 12 18 42 44 55 67 94

Mg. Ing. Gilberto Carrión Barco 31


Algoritmo selección

Array
original: 44 55 12 42 94 18 06 67

i=2 06 55 12 42 94 18 44 67
i=3 06 12 55 42 94 18 44 67
i=4 06 12 18 42 94 55 44 67
i=5 06 12 18 42 94 55 44 67
i=6 06 12 18 42 44 55 94 67
i=7 06 12 18 42 44 55 94 67
i=8 06 12 18 42 44 55 67 94

Mg. Ing. Gilberto Carrión Barco 32


Algoritmo selección

Array
original: 44 55 12 42 94 18 06 67

i=2 06 55 12 42 94 18 44 67
i=3 06 12 55 42 94 18 44 67
i=4 06 12 18 42 94 55 44 67
i=5 06 12 18 42 94 55 44 67
i=6 06 12 18 42 44 55 94 67
i=7 06 12 18 42 44 55 94 67
i=8 06 12 18 42 44 55 67 94

Mg. Ing. Gilberto Carrión Barco 33


Algoritmo selección
for(i=0;i<n-1;i++) { public static void Seleccion(int[]matrix){
k=i; int i, j, k, p, buffer, limit = matrix.length-1;
t=a[i]; for(k = 0; k < limit; k++){
p = k;
for (j=i+1; j<n; j++) {
for(i = k+1; i < = limit; i++){
if (a[j] < t) {
if(matrix[i] < matrix[p]) p = i;
t= a[j];
if(p != k){
k=j;
buffer = matrix[p];
} matrix[p] = matrix[k];
a[k]= a[i]; matrix[k] = buffer;
a[i]= t; }
} }
} }
}

Mg. Ing. Gilberto Carrión Barco 34


Algoritmo rápido (Quicksort)
 La ordenación rápida se basa en el hecho que los intercambios
deben ser realizados preferentemente sobre distancias grandes.
 El algoritmo a seguir es el mismo que se aplica cuando se quiere
ordenar un gran montón de exámenes:
• Seleccionar un valor de división (L por ejemplo) y dividir el
montón en dos pilas, A-L y M-Z. Después se toma la primera pila
y se subdivide en dos, A-F y G-L por ejemplo.
• A su vez la pila A-F puede subdividirse en A-C y D-F.
• Este proceso continúa hasta que las pilas sean suficientemente
pequeñas para ordenarlas fácilmente. El mismo proceso se
aplica a la otra pila.

Mg. Ing. Gilberto Carrión Barco 35


Algoritmo rápido (Quicksort)
 En este caso se toma un elemento x del array (el del medio por
ejemplo), se busca en el array desde la izquierda hasta que >x, lo
mismo se hace desde la derecha hasta encontrar <x.
 Después se intercambia esos elementos y se continúa ese proceso
hasta que los índices se encuentren en la mitad del array.
 Se aplica el mismo proceso para la porción izquierda del array entre el
extremo izquierdo y el índice derecho y para la porción derecha entre
el extremo derecho y el último índice izquierdo.

Mg. Ing. Gilberto Carrión Barco 36


Algoritmo rápido (Quicksort)
 Descripción del algoritmo:

 1) Dividir: Si la secuencia S tiene 2 o más elementos, seleccionar un


elemento x de S como pivote. Cualquier elemento arbitrario, como el último,
puede servir. Elimiar los elementos de S dividiéndolos en 3 secuencias:

L, contiene los elementos de S menores que x

E, contiene los elementos de S iguales a x

G, contiene los elementos de S mayores que x

2) Recursión: De forma recursiva ordenar L y G

3) Vencer: Finalmente, colocar nuevamente los elementos en S en orden,


primero insertar los elementos de L, después E, y los elementos de G.

Mg. Ing. Gilberto Carrión Barco 37


Idea de Quick Sort

1) Selección: tomar un elemento

2) Dividir: reordenar los elementos tal que x


va a su posición final E

3) Recursión y Vencer: ordenar recursivamente

Mg. Ing. Gilberto Carrión Barco 38


Algoritmo rápido (Quicksort)
int Izq=0, Der=N-1;
Quick(V, Izq, Der); if (i<j) {
public static void Quit(int V[], int Izq, int Der){ Aux= V[i];
int pivote=V[Izq]; V[i]=V[j];
int i=Izq; V[j]=Aux;
int j=Der; }
int Aux; }
V[Izq]=V[j];
while(i<j){
V[j]=pivote;
while(V[i]<=pivote && i<j) i++;
if(Izq<j-1)
while(V[j]>pivote) j--;
Quick(V,Izq,j-1);
if(j+1 <Der)
Quick(V,j+1,Der);

Mg. Ing. Gilberto Carrión Barco 39


Otros Algoritmos de Ordenamiento
public static void shellSort(int[] matrix) {
for ( int increment = matrix.length / 2;increment > 0;
increment = (increment == 2 ? 1 : (int) Math.round(increment / 2.2))) {
for (int i = increment; i < matrix.length; i++) {
for (int j = i; j > = increment && matrix[j - increment] > matrix[j]; j -=
increment) {
int temp = matrix[j];
matrix[j] = matrix[j - increment];
matrix[j - increment] = temp;
}
}
}
}

Mg. Ing. Gilberto Carrión Barco 40


Otros Algoritmos de Ordenamiento
public static void mergesort(int[ ] matrix, int init, int n){
int n1;
int n2;
if (n > 1){
n1 = n / 2;
n2 = n - n1;
mergesort(matrix, init, n1);
mergesort(matrix, init + n1, n2);
merge(matrix, init, n1, n2);
}
}

Mg. Ing. Gilberto Carrión Barco 41


Otros Algoritmos de Ordenamiento
private static void merge(int[ ] matrix, int init, int n1, int n2){
int[ ] buffer = new int[n1+n2];
int temp = 0; int temp1 = 0; int temp2 = 0; int i;
while ((temp1 < n1) && (temp2 < n2)){
if (matrix[init + temp1] < matrix[init + n1 + temp2]){
buffer[temp++] = matrix[init + (temp1++)];
}else{
buffer[temp++] = matrix[init + n1 + (temp2++)];
}
}
…….

Mg. Ing. Gilberto Carrión Barco 42


Otros Algoritmos de Ordenamiento
…..
while (temp1 < n1){
buffer[temp++] = matrix[init + (temp1++)];
}
while (temp2 < n2){
buffer[temp++] = matrix[init + n1 + (temp2++)];
}
for (i = 0; i < n1+n2; i++){
matrix[init + i] = buffer[i];
}
}

Mg. Ing. Gilberto Carrión Barco 43


Resumen

Mg. Ing. Gilberto Carrión Barco 44

S-ar putea să vă placă și