Está en la página 1de 18

Algoritmos de Ordenamiento

Fernando A. Lagos B.
Copyleft 2007

INDICE

1 Introduccin 2 !ipos de Algorit"os 2.1 Algorit"os iterati$os 2.2 Algorit"os recursi$os '(todo de la Bur)*+a .1 Bur)*+a ,-"ple .2 Bur)*+a 'e+orada . Bur)*+a 0pti"i1ada # Insercion y seleccin % 2rdena"iento por 'e1cla & '(todo Shellsort 7 '(todo 3pido 4quicksort5 . Co"ple+idad

Pg. Pg. # Pg. % Pg. & Pg. 7 Pg. . Pg. / Pg. 10 Pg. 11 Pg. 12 Pg. 1# Pg. 1% Pg. 17

1 - INTRODUCCION
Los algorit"os de ordena"iento nos per"ite6 co"o su no")re lo dice6 ordenar. 7n este caso6 nos ser$iran para ordenar $ectores o "atrices con $alores asignados aleatoria"ente. 8os centrare"os en los "(todos "s populares6 anali1ando la cantidad de co"paraciones 9ue suceden6 el tie"po 9ue de"ora y re$isando el cdigo6 escrito en :a$a6 de cada algorit"o. 7ste infor"e nos per"itir conocer "as a fondo cada "etodo distinto de ordena"iento6 desde uno si"ple ;asta el "as co"ple+o. ,e reali1aran co"paraciones en tie"po de e+ecucion6 pre<re9uisitos de cada algorit"o6 funcionalidad6 alcance6 etc.

2 TIPOS DE ALROGIT OS
Para poder ordenar una cantidad deter"inada de nu"eros al"acenadas en un $ector o "atri16 e=isten distintos "etodos 4algoritmos5 con distintas caracteristicas y co"ple+idad. 7=iste desde el "etodo "as si"ple6 co"o el Bubblesort 4o '(todo Bur)*+a56 9ue son si"ples iteraciones6 ;asta el Quicksort 4'(todo 3pido56 9ue al estar opti"i1ado usando recursion6 su tie"po de e+ecucion es "enor y es "s efecti$o.

2!1

ETODOS ITERATI"OS

7stos "etodos son si"ples de entender y de progra"ar ya 9ue son iterati$os6 si"ples ciclos y sentencias 9ue ;acen 9ue el $ector pueda ser ordenado. >entro de los Algorit"os iterati$os encontra"os? Bur)u+a Insercin ,eleccin ,;ellsort

2!2 -

ETODOS RECURSI"OS

7stos "etodos son a*n "as co"ple+os6 re9uieren de "ayor atencin y conoci"iento para ser entendidos. ,on rpidos y efecti$os6 utili1an general"ente la t(cnica Divide y vencers6 9ue consiste en di$idir un pro)le"a grande en $arios pe9ue@os para 9ue sea "s fcil resol$erlos. 'ediante lla"adas recursi$as a si "is"os6 es posi)le 9ue el tie"po de e+ecucin y de ordenacin sea "s opti"o. >ento de los algorit"os recursi$os encontra"os? 2rdena"iento por 'e1clas 4merge5 2rdena"iento 3pido 4quick5

ETODO DE LA $UR$U%A

7l "etodo de la )ur)u+a es uno de los "as si"ples6 es tan facil co"o co"parar todos los ele"entos de una lista contra todos6 si se cu"ple 9ue uno es "ayor o "enor a otro6 entonces los interca")ia de posicin. Por e+e"eplo6 i"agine"os 9ue tene"os los siguientes $alores? % & 1 0

Lo 9ue ;aria una )ur)u+a si"ple6 seria co"en1ar recorriendo los $alores de i19. a derec;a6 co"en1ando por el %. Lo co"para con el &6 con el 16 con el 0 y con el 6 si es "ayor o "enor 4dependiendo si el orden es ascendiente o descendiente5 se interca")ian de posicion. Luego continua con el siguiente6 con el &6 y lo co"para con todos los ele"entos de la lista6 esperando $er si se cu"ple o no la "is"a condicion 9ue con el pri"er ele"ento. Asi6 sucesi$a"ente6 ;asta el ulti"o ele"ento de la lista.

#! 1 $UR$U%A SI PLE
Co"o lo descri)i"os en el item anterior6 la )ur)u+a "as si"ple de todas es la 9ue co"para todos con todos6 generando co"paraciones e=tras6 por e+e"plo6 no tiene sentido 9ue se co"pare con sigo "is"o o 9ue se co"pare con los $alores anteriores a el6 ya 9ue supuesta"ente6 ya estan ordenados.

for (i=1; i<LIMITE; i++) for j=0 ; j<LIMITE - 1; j++) if (vector[j] > vector[j+1]) temp = vector[j]; vector[j] = vector[j+1]; vector[j+1] = temp;

#! 2- $UR$U%A

E%ORADA

Ana nue$a $ersion del "etodo de la )ur)u+a seria li"itando el nu"ero de co"paraciones6 di+i"os 9ue era inutil 9ue se co"pare consigo "is"a. ,i tene"os una lista de 10.000 ele"entos6 entonces son 10.000 co"paraciones 9ue estan so)rando. I"agine"os si tene"os 1.000.000 de ele"entos. 7l "etodo seria "uc;o "as opti"o con BnC co"paraciones "enos 4n D total de ele"entos5.

#! #- $UR$U%A OPTI I&ADA


,i al ca")io anterior 4el de la )ur)u+a "e+orada5 le su"a"os otro ca")io6 el ;ec;o 9ue los ele"entos 9ue estan detrs del 9ue se esta co"parando6 ya estan ordenados6 las co"paraciones serian aun "enos y el "etodo seria aun "as efecti$o. ,i tene"os una lista de 10 ele"entos y esta"os anali1ando el 9uinto ele"ento6 9ue sentido tiene 9ue el 9uinto se co"pare con el pri"ero6 el segundo o el tercero6 si supuesta"ente6 ya estan ordenadosE 7ntonces opti"i1a"os "as aun el algorit"o6 9uedando nuestra $ersion final del algorit"o opti"i1ado de la siguiente "anera?

Bu &

!e"ort(i#t m$tri%[]) i#t uffer; i#t i'j; for(i = 0; i < m$tri%(!e#)t*; i++) & for(j = 0; j < i; j++) & if(m$tri%[i] < m$tri%[j]) & uffer = m$tri%[j]; m$tri%[j] = m$tri%[i]; m$tri%[i] = uffer; + + +

' INSERCION ( SELECCION

I#"ercio#(i#t m$tri,[]) & i#t i' temp' j; for (i = 1; i < m$tri,(!e#)t*; i++) & temp = m$tri,[i]; j = i - 1; -*i!e ( (m$tri,[j] > temp) .. (j >= 0) ) & m$tri,[j + 1] = m$tri,[j]; j--; + m$tri,[j + 1] = temp; + + /e!eccio#(i#t[]m$tri,) & i#t i' j' 0' p' uffer' !imit = m$tri,(!e#)t*-1; for(0 = 0; 0 < !imit; 0++) & p = 0; for(i = 0+1; i <= !imit; i++) if(m$tri,[i] < m$tri,[p]) p = i; if(p 1= 0) & uffer = m$tri,[p]; m$tri,[p] = m$tri,[0]; m$tri,[0] = uffer; + + +

7l )ucle principal de la ordenacion por insercion $a e=a"inando sucesi$a"ente todos los ele"entos de la "atri1 desde el segundo ;asta el n<(si"o6 e inserta cada uno en el lugar adecuado entre sus precedesores dentro de la "atri1. La ordenacion por seleccin funciona seleccionando el "enor ele"ento de la "atri1 y lle$andolo al principioF a continuacion selecciona el siguiente "enor y lo pone en la segunda posicion de la "atri1" y asi sucesi$a"ente.

) ORDENA IENTO POR

E&CLA

7ste algorit"o consiste )asica"ente en di$idir en partes iguales la lista de nu"eros y luego "e1clarlos co"parandolos6 de+andolos ordenados. ,i se piensa en este algorit"o recursi$a"ente6 pode"os i"aginar 9ue di$idir la lista ;asta tener un ele"ento en cada lista6 luego lo co"para con el 9ue est a su lado y seg*n corresponda6 lo situa donde corresponde. 7n la siguiente figura pode"os $er co"o funciona?

7l algorit"o de ordena"iento por "e1cla 4Mergesort5 se di$ide en dos procesos6 pri"ero se di$ide en partes iguales la lista?
pu !ic "t$tic voi2 mer)e"ort(i#t[ ] m$tri,' i#t i#it' i#t #) & i#t #1; i#t #3; if (# > 1) & #1 = # 4 3; #3 = # - #1; mer)e"ort(m$tri,' i#it' #1); mer)e"ort(m$tri,' i#it + #1' #3); mer)e(m$tri,' i#it' #1' #3); + +

G el algorit"o 9ue nos per"ite "e1clar los ele"entos seg*n corresponda?


priv$te "t$tic voi2 mer)e(i#t[ ] m$tri,' i#t i#it' i#t #1' i#t #3) & i#t[ ] uffer = #e- i#t[#1+#3]; i#t temp = 0; i#t temp1 = 0; i#t temp3 = 0; i#t i; -*i!e ((temp1 < #1) .. (temp3 < #3)) & if (m$tri,[i#it + temp1] < m$tri,[i#it + #1 + temp3]) uffer[temp++] = m$tri,[i#it + (temp1++)]; e!"e uffer[temp++] = m$tri,[i#it + #1 + (temp3++)]; + -*i!e (temp1 < #1) uffer[temp++] = m$tri,[i#it + (temp1++)]; -*i!e (temp3 < #3) uffer[temp++] = m$tri,[i#it + #1 + (temp3++)]; for (i = 0; i < #1+#3; i++) m$tri,[i#it + i] = uffer[i]; +

ETODO S+ELLSORT

7ste "etodo es una "e+ora del algorit"o de ordena"iento por Insercion 4Insertsort5. ,i tene"os en cuenta 9ue el ordena"iento por insercion es "uc;o "as eficiente si nuestra lista de nu"eros esta se"i<ordenada y 9ue despla1a un $alor una unica posicion a la $e1. >urante la e+ecucion de este algorit"o6 los nu"eros de la lista se $an casi<ordenando y final"ente6 el ulti"o paso o funcion de este algorit"o es un si"ple "etodo por insercion 9ue6 al estar casi<ordenados los nu"eros6 es "s eficiente. 7l algorit"o?

pu !ic voi2 "*e!!/ort(i#t[] m$tri,) & for ( i#t i#creme#t = m$tri,(!e#)t* 4 3; i#creme#t > 0; i#creme#t = (i#creme#t == 3 5 1 6 (i#t) M$t*(rou#2(i#creme#t 4 3(3))) & for (i#t i = i#creme#t; i < m$tri,(!e#)t*; i++) & for (i#t j = i; j >= i#creme#t .. m$tri,[j - i#creme#t] > m$tri,[j]; j -= i#creme#t) & i#t temp = m$tri,[j]; m$tri,[j] = m$tri,[j - i#creme#t]; m$tri,[j - i#creme#t] = temp; + + + +

,-

ETODO RAPIDO -quicksort.

,in duda6 este algorit"o es uno de los "as eficientes. 7ste "etodo es el "as rapido gracias a sus lla"adas recursi$as6 )asandose en la teoria de divide y vencers. Lo 9ue ;ace este algorit"o es di$idir recur$isa"ente el $ector en partes iguales6 indicando un ele"ento de inicio6 fin y un pi$ote 4o co"odin5 9ue nos per"itira seg"entar nuestra lista. Ana $e1 di$idida6 lo 9ue ;ace6 es de+ar todos los "ayores 9ue el pi$ote a su derec;a y todos los "enores a su i19. Al finali1ar el algorit"o6 nuestros ele"entos estan ordenados. Por e+e"plo6 si tene"os % # . )asica"ente lo 9ue ;ace el algorit"o es di$idir la lista de # ele"entos en partes iguales6 por un lado 6 por otro lado # . y co"o co"odin o pi$ote el %. Luego pregunta6 es "ayor o "enor 9ue el co"odinE 7s "enor6 entonces lo de+a al lado i19. G co"o se aca)aron los ele"entos de ese lado6 $a"os al otro lado. # 7s "ayor o "enor 9ue el pi$oteE 'enor6 entonces lo tira a su i19. Luego pregunta por el .6 al ser "ayor lo de+a donde esta6 9uedando algo asi? #%. 7n esta figura se ilustra de "e+or "anera un $ector con "as ele"entos6 usando co"o pi$ote el pri"er ele"ento?

7l algorit"o es el siguiente?
pu !ic voi2 78uic0"ort(i#t m$tri,[]' i#t $' i#t & t*i"(m$tri, = #e- i#t[m$tri,(!e#)t*]; i#t uf; i#t from = $; i#t to = ; i#t pivot = m$tri,[(from+to)43]; 2o & -*i!e(m$tri,[from] < pivot) & from++; + -*i!e(m$tri,[to] > pivot) & to--; + if(from <= to) & uf = m$tri,[from]; m$tri,[from] = m$tri,[to]; m$tri,[to] = uf; from++; to--; + +-*i!e(from <= to); if($ < to) & 78uic0"ort(m$tri,' $' to); + if(from < ) & 78uic0"ort(m$tri,' from' ); + t*i"(m$tri, = m$tri,; + )

/ CO PLE%IDAD
Cada algorit"o de ordena"iento por definicion tiene operaciones y calculos "ini"os y "a=i"os 9ue reali1a 4co"ple+idad56 a continuacion una ta)la 9ue indica la cantidad de calculos 9ue corresponden a cada "etodo de ordena"iento?

Algorit"o Bur)u+a Insercion ,eleccin ,;ell 'erge KuicL H4nI5 H4nIJ#5 H4nI5

2peraciones "=i"as

H4n logIn5 H4n logn5 H4nI5 en peor de los casos y H4n logn5 en el
pro"edio de los casos.

0 CO PARACION DE TIE POS


,e ;an ordenado una cantidad deter"inada de ele"entos aleatorios en una lista "ediante distintos "etodos de ordena"iento. 4en segundos5

2%& ele"entos Bur)u+a? ,eleccion? Insercion? 3apido? ,;ell? 'erge? 0.00#0 0.00 0 0.00#0 0.0010 0.0010 0.00#0

%12 ele"entos Bur)u+a? ,eleccion? Insercion? 3apido? ,;ell? 'erge? 0.00%0 0.00#0 0.00%0 0.0010 0.0020 0.00 0

20#. ele"entos Bur)u+a? ,eleccion? Insercion? 3apido? ,;ell? 'erge? 0.022 0.01% 0.01 0.0010 0.00&0 0.00%0

1& .# ele"entos Bur)u+a? ,eleccion? Insercion? 3apido? ,;ell? 'erge? 1.0%% 0./ 0.%77 0.00.0 0.00/0 0.01#

2&21## ele"entos Bur)u+a? ,eleccion? Insercion? 3apido? ,;ell? 'erge? 17..20% 1%..2%/ /#.#&1 0.0&1 0.0.& 0.201

20/71%2 ele"entos Bur)u+a? ,eleccion? Insercion? 3apido? ,;ell? 'erge? 11/7..107 10711.01 7 71.727 0.%/& 0..% 1. 27

Co"o pode"os anali1ar6 el algorit"o 9ue se $a de"orando cada $e1 "as tie"po es el de la )ur)u+a6 luego de seleccin y tercero el insercion. Los algorit"os 9ue los siguen son el ,;ell y el de ordenacion por "e1cla6 pero el "s opti"o es el B3apidoC

También podría gustarte