Está en la página 1de 17

Apuntes de ALGORTMICA

UNIDAD 4 Estructuras estticas: arrays A!"#rit$#s de #rdenaci%n de arrays


&r#'es#r: (#rdi &#)# Cat*

Curso 2009-2010

ALGORTMICA Estructuras estticas: arrays. Algoritmos de ordenacin de arrays.

!I"A" #

Contenido
Contenido....................................................................................................................... 2 Estructuras de datos. ....................................................................................................3 Arrays............................................................................................................................ 4 Arrays unidimensionales o vectores...........................................................................5 Arrays bidimensionales o matrices.............................................................................6 Recorrido de un array.................................................................................................9 rdenaci!n de un array............................................................................................10

ALGORTMICA Estructuras estticas: arrays. Algoritmos de ordenacin de arrays.

!I"A" #

Estructuras de datos.
"na estructura de #atos es una colecci!n de datos $ue %ueden ser caracteri&ados %or su or'ani&aci!n y las o%eraciones $ue se de(inen en ella.

)os datos de ti%o est*ndar %ueden ser or'ani&ados b*sicamente en dos clases distintas de estructuras de datos+ Estructuras de datos est*ticas. Estructuras de datos din*micas.

)as estructuras de datos din*micas son a$uellas %ara las $ue el es%acio asi'nado en memoria se %uede modi(icar durante el tiem%o en e,ecuci!n. )as estructuras de datos est*ticas son las $ue el es%acio $ue ocu%an en memoria $ueda de(inido durante la com%ilaci!n y no %uede modi(icarse durante el tiem%o de e,ecuci!n.

Como e,em%lo de estructuras de datos est*ticas tenemos las si'uientes+ Arrays Re'istros Con,untos Cadenas -ic.eros

Como ti%os de estructuras de datos din*micas tenemos la si'uiente lista+ /rboles 0ra(os )istas

)as estructuras de datos din*micas no est*n so%ortadas en todos los len'ua,es.

El .ec.o de utili&ar un ti%o u otro de estructura de datos estar* en (unci!n de la tarea a llevar a cabo y del ti%o de len'ua,e de %ro'ramaci!n utili&ado.

ALGORTMICA Estructuras estticas: arrays. Algoritmos de ordenacin de arrays.

!I"A" #

En este tema1 nos vamos a centrar 2nicamente en las estructuras de datos est*ticas y m*s concretamente1 en los arrays.

Arrays.
3e de(ine array como una colecci!n de datos del mismo ti%o1 $ue se almacenan en %osiciones conti'uas de memoria y reciben un nombre com2n. 4ara acceder a un determinado elemento del array se utili&a un 5ndice1 el cual va a es%eci(icar su %osici!n relativa dentro del array. E6isten los si'uientes ti%os de arrays+ "nidimensionales o vectores. 7idimensionales o matrices 8tambi9n llamados tablas: ;ultidimensionales1 de tres o m*s dimensiones 8tambi9n llamados %oliedros:

<ector

;atri&

ALGORTMICA Estructuras estticas: arrays. Algoritmos de ordenacin de arrays.

!I"A" #

Array tridimensional o %oliedro

Arrays unidimensionales o vectores


=odo dato a utili&ar en un al'oritmo se tiene $ue declarar %reviamente y los arrays no son una e6ce%ci!n. 4ara declarar un array1 antes se debe declarar el ti%o a utili&ar %or el array1 %ara %osteriormente %oder declarar los datos de dic.o ti%o.

Al tratarse de un ti%o estructurado de datos1 se reali&ar* la declaraci!n en base a otro ti%o est*ndar de datos o a uno %reviamente de(inido1 al $ue se denomina ti%o base1 %ues todos los elementos del array son de ese mismo ti%o.

tipo array[0..n] de tipo_base : nombre_del_tipo;

var nombre_del_tipo: nombre_del_vector;

#ado $ue1 %or norma 'eneral1 los vectores suelen em%e&ar %or el elemento con 5ndice i'ual a 0 como %rimer elemento1 el tama>o o lon'itud del vector se %uede calcular mediante la si'uiente (!rmula+ <ltimo_ndice> - <primer_ndice> + 1 = longitud del vector

ALGORTMICA Estructuras estticas: arrays. Algoritmos de ordenacin de arrays.

!I"A" #

Cual$uier elemento de un vector %uede seleccionarse de modo totalmente arbitrario y todos ellos ser*n i'ualmente accesibles. El sistema de re(erencia se basa en el uso de un 5ndice $ue se>ala la %osici!n relativa de un elemento 8el elemento seleccionado: dentro del vector. #e manera $ue1 si $ueremos re(erenciar el elemento con 5ndice i'ual a 3 dentro del vector denominado vect1 utili&ar5amos la si'uiente sinta6is+ vect[3]

En resumen1 %ara declarar un vector1 es decir1 un array unidimensional1 %odemos tomar nota del si'uiente e,em%lo+

tipo array[0..5] de int : vector;

var vector: vect;

=ambi9n cabe la %osibilidad de de(inir un array estableciendo solo el n2mero de elementos $ue contiene1 de manera $ue nos $ueda el e,em%lo de la si'uiente (orma+

tipo array[6] de int : vector;

var vector: vect;

Arrays bidimensionales o matrices


4odemos de(inir un array bidimensional o matriz como un vector de vectores1 al $ue tambi9n se le denomina tabla. As5 %ues1 dis%onemos de un con,unto de elementos del mismo ti%o en el $ue el orden de sus com%onentes es si'ni(icativo y

ALGORTMICA Estructuras estticas: arrays. Algoritmos de ordenacin de arrays.

!I"A" #

%ara el $ue se necesita es%eci(icar dos 5ndices %ara la identi(icaci!n de cada uno de sus elementos. 4ara declarar una matri& o tabla se reali&a de la si'uiente (orma+

tipo array[0..n] [0..n] de tipo_base : nombre_del_tipo;

var nombre_del_tipo: nombre_de_la_matriz;

4or tanto1 %ara declarar una matri&1 %odemos utili&ar como muestra el si'uiente e,em%lo+

tipo array[0..5,0..5] de int : matriz;

var matriz: matr;

=ambi9n1 al i'ual $ue %ara los vectores1 cabe la %osibilidad de de(inir una matri& estableciendo solo el n2mero de elementos $ue contiene1 de manera $ue nos $ueda el e,em%lo anterior de esta (orma+

tipo array[6,6] de int : matriz;

var matriz: mat;

En este caso1 la re(erencia a cual$uier elemento de una matri& debe reali&arse mediante el uso de un %rimer 5ndice1 $ue nos indicar* la fila1 y de un se'undo 5ndice1 $ue nos indicar* la columna. #e esta (orma1 si $ueremos re(erenciar el elemento de la (ila 3 y columna 4 de nuestra matri& matr1 utili&ar5amos la si'uiente sinta6is+ ?

ALGORTMICA Estructuras estticas: arrays. Algoritmos de ordenacin de arrays.

!I"A" #

matr[3,4]

ALGORTMICA Estructuras estticas: arrays. Algoritmos de ordenacin de arrays.

!I"A" #

Recorrido de un array
4ara recorrer todos los elementos de un array se utili&an estructuras re%etitivas1 mediante las $ue se 'estionan y controlan los 5ndices del array. 3i el array en cuesti!n es un vector1 2nicamente ser* necesario el uso de una estructura re%etitiva.

4ara reali&ar el recorrido de una matri& se necesitar*n dos estructuras re%etitivas anidadas1 una %ara 'estionar y controlar las (ilas y la otra %ara controlar las columnas. En el caso de recorrer una matri&1 %odemos reali&ar dos ti%os de recorridos+ Recorrido %or (ilas Recorrido %or columnas

Recorrido por filas =enemos las si'uientes declaraciones+

tipo array[6,5] de int : matriz;

var matriz: mat;

3i sabemos $ue todos los elementos de la matri& contienen datos v*lidos1 el si'uiente tramo de al'oritmo nos muestra1 en %rimer lu'ar1 el contenido de los elementos de la %rimera (ila1 a continuaci!n los de la se'unda (ila1 etc.

para i 0 hasta 5 hacer para j 0 hasta 4 hacer escribir(mat[i,j]); fpara fpara

ALGORTMICA Estructuras estticas: arrays. Algoritmos de ordenacin de arrays. Recorrido por columnas

!I"A" #

Con las declaraciones anteriores1 el si'uiente al'oritmo nos mostrar* %or %antalla %rimero el contenido de la %rimera (ila de la matri&1 lue'o el de la se'unda (ila y as5 sucesivamente1 %ara todas y cada una de las (ilas de la matri&+

para j 0 hasta 4 hacer para i 0 hasta 5 hacer escribir(mat[i,j]); fpara fpara

3i necesitamos recorrer una matri& de n dimensiones1 ser* necesario el uso de n estructuras re%etitivas anidadas.

Ordenacin de un array
)a ordenaci!n o clasi(icaci!n de una estructura de datos1 y m*s concretamente de un array1 se basa en la or'ani&aci!n de todos sus elementos en orden creciente o decreciente1 tomando como re(erencia el contenido o la in(ormaci!n de uno de sus cam%os. )a ordenaci!n %uede ser+ Externa1 cuando los datos est*n almacenados en un dis%ositivo de almacenamiento e6terno. Interna1 o de arrays1 en el caso de $ue los datos se .allen ubicados en memoria y se %ueda acceder a la misma1 bien de (orma directa o bien de (orma aleatoria. Este ti%o de ordenaci!n es el $ue va ocu%ar este a%artado.

Ordenacin interna )os m9todos de este ti%o de ordenaci!n se suelen a%licar sobre arrays unidimensionales1 es decir1 sobre vectores1 aun$ue se %ueden utili&ar a cual$uier otro ti%o de array1 ya sean tabalas o %oliedros1 teniendo en cuenta la correcta a%licaci!n de cual$uiera de los m9todos estudiados res%ecto a (ilas1 columnas1A )os m9todos m*s conocidos son+ 10 3elecci!n

ALGORTMICA Estructuras estticas: arrays. Algoritmos de ordenacin de arrays. 7urbu,a Bnserci!n 3.ell CuicD sort 8ordenaci!n r*%ida:

!I"A" #

a: Ordenacin por seleccin Este ti%o de ordenaci!n se (undamenta en la locali&aci!n del elemento de menor valor del vector %ara colocarlo en la %rimera %osici!n. A continuaci!n1 se locali&a el se'undo elemento de menor valor y se le coloca en la se'unda %osici!n del vector1A y as5 sucesivamente .asta com%letar y ordenar todos los elementos de dic.o vector.

3i tenemos el si'uiente contenido en un vector+ 4, 1, 5, -3, 8 3e com%arar5a el elemento corres%ondiente a la %rimera %osici!n del vector con los restantes elementos1 de la manera si'uiente+

4, 1, 5, -3, 8 1, 4, 5, -3, 8 1, 4, 5, -3, 8 -3, 4, 5, 1, 8

#e esta (orma1 el elemento de menor valor $ueda colocado en la %rimera %osici!n del vector y1 se'uidamente1 %asar5amos a com%arar el se'undo elemento del vector con los elementos restantes+ 4, 5, 1, 8 4, 5, 1, 8 1, 5, 4, 8

"na ve& seleccionado y ordenado el se'undo elemento1 se %rocede a ordenar el tercer elemento1 com%ar*ndose con los restantes+

5, 4, 8 11

ALGORTMICA Estructuras estticas: arrays. Algoritmos de ordenacin de arrays. 4, 5, 8

!I"A" #

-inalmente1 com%arar5amos el cuarto elemento+

5, 8 5, 8

Eos $ueda entonces el vector ordenado con la si'uiente in(ormaci!n+ -3, 1, 4, 5, 8

3e %odr5a utili&ar el mismo m9todo1 %ero con una ordenaci!n de (orma descendente1 es decir1 em%e&ando %or el elemento de mayor valor como %rimer elemento del vector .asta obtener el elemento de menor valor como 2ltimo elemento del vector.

b: Ordenacin por el mtodo de la burbuja Este ti%o de al'oritmo de ordenaci!n1 tambi9n conocido como clasi(icaci!n %or intercambio1 est* basado en la com%araci!n de elementos conti'uos e intercambiarlos .asta $ue se consi'a la total ordenaci!n del vector. 3i utili&amos el vector del e,em%lo anterior+

4, 1, 5, -3, 8

Em%e&amos la ordenaci!n+ 4, 1, 5, -3, 8 1, 4, 5, -3, 8 1, 4, 5, -3, 8 1, 4, -3, 5, 8

El @ nos $ueda al (inal de la lista. 3e'uimos con la ordenaci!n+ 1, 4, -3, 5, 8

12

ALGORTMICA Estructuras estticas: arrays. Algoritmos de ordenacin de arrays. 1, 4, -3, 5 1, 4, -3, 5 1, -3, 4, 5

!I"A" #

En esta ocasi!n1 el 5 nos $ueda ya en la 2ltima %osici!n1 ordenado correctamente. Continuamos con la o%eraci!n+ 1, -3, 4, 5 1, -3, 4 -3, 1, 4

A$u51 el 4 $ueda en la tercera %osici!n1 situado correctamente. 3i se'uimos adelante con la ordenaci!n+ -3, 1, 4 -3, 1

)le'ado a este %unto1 el 1 $ueda en la se'unda %osici!n y el F3 $ueda en la %rimera1 de (orma $ue el vector ya est* totalmente ordenado+

-3, 1, 4, 5, 8

c: Ordenacin por insercin

Esta ordenaci!n se basa en la inserci!n de un elemento en una %arte ya ordenada del vector1 en la %osici!n correcta %ara $ue no se %ierda la ordenaci!n y continuar con el resto de los elementos. 4ara averi'uar d!nde debe insertarse dic.o elemento se utili&a una b2s$ueda secuencial en la %arte ordenada del vector. 3i tomamos nuevamente el vector anterior+

4, 1, 5, -3, 8

Consideramos como subvector inicial el %rimer elemento1 41 con un 2nico elemento y1 adem*s1 ordenado. 3e toma el resto de elementos del vector1 desde el $ue se .alla

13

ALGORTMICA Estructuras estticas: arrays. Algoritmos de ordenacin de arrays.

!I"A" #

en la se'unda %osici!n .asta $ue se lle'a al 2ltimo elemento del mismo. Cuando se encuentra en el subvector la %osici!n correcta1 se reali&a la inserci!n del elemento.

)os elementos del vector se mueven cada ve& $ue sea necesario y el vector se va trans(ormando de la si'uiente (orma+

4, 1, 5, -3, 8 1, 4, 5, -3, 8 1, 4, 5, -3, 8 -3, 1, 4, 5, 8 -3, 1, 4, 5, 8

d: Ordenacin shell

Este m9todo utili&a com%araciones entre elementos no consecutivos1 se%arados %or intervalos mayores $ue 1. Estos intervalos se van decrementando de (orma sucesiva. Este m9todo suele ser m*s e(ectivo cuando mayor tama>o ten'a el vector. =omando nuevamente el vector anterior+

4, 1, 5, -3, 8

E(ectuamos la %rimera %asada sobre el mismo1 reali&ando las com%araciones e intercambios entre a$uellos elementos $ue ten'an una se%araci!n %or un intervalo de 5G21 de (orma $ue com%aramos los elementos de la %osici!n 1 con el de la %osici!n 31 el elemento 2 con el elemento de la %osici!n 41 reali&ando en este caso un intercambio1 y el elemento 3 con el de la %osici!n 5. Eos $ueda a.ora el vector de la si'uiente (orma+

4, -3, 5, 1, 8

A.ora se e(ectua la com%araci!n reduciendo la distancia de los elementos a com%arar a la mitad1 recorriendo de nuevo el vector. 4ara ello se com%ara el elemento 1 con el elemento 21 reali&*ndose un intercambio1 y el elemento 3 con el elemento 41 donde tambi9n se reali&a otro intercambio1 $uedando el vector de la si'uiente (orma+

-3, 4, 1, 5, 8

14

ALGORTMICA Estructuras estticas: arrays. Algoritmos de ordenacin de arrays.

!I"A" #

3e continuar* com%arando1 a.ora con un intervalo i'ual a la unidad1 .asta $ue el vector nos $ueda totalmente ordenado1 intercambiando los valores de la %osici!n 2 con el de la %osici!n 31 consi'ui9ndose la ordenaci!n total del vector+

-3, 1, 4, 5, 8 e: Ordenacin rpida ( uic! sort"

Este m9todo se basa en la t*ctica Hdivide y vencer*sH1 $ue consiste en ir subdividiendo el vector en vectores m*s %e$ue>os1 y ordenar 9stos. 4ara .acer esta divisi!n1 se toma un valor del vector como %ivote1 y se mueven todos los elementos menores $ue este %ivote a su i&$uierda1 y los mayores a su derec.a. A continuaci!n se a%lica el mismo m9todo a cada una de las dos %artes en las $ue $ueda dividido el vector. Eormalmente se toma como %ivote el %rimer elemento de vector1 y se reali&an dos b2s$uedas+ una de i&$uierda a derec.a1 buscando un elemento mayor $ue el %ivote1 y otra de derec.a a i&$uierda1 buscando un elemento menor $ue el %ivote. Cuando se .an encontrado los dos1 se intercambian1 y se si'ue reali&ando la b2s$ueda .asta $ue las dos b2s$uedas se encuentran. 4or e,em%lo1 %ara dividir el vector I211 401 41 91 101 35J1 los %asos ser5an+
{21, 40, 4, 9, 10, 35} !! se toma como pivote el "#. $a b%s&'eda de iz&'ierda a derec(a enc'entra el valor 40, ma)or &'e pivote, ) la b%s&'eda de derec(a a iz&'ierda enc'entra el valor #0, menor &'e el pivote. *e intercambian: {21, 10, 4, 9, 40, 35} !! *i se+'imos la b%s&'eda, la primera enc'entra el valor 40, ) la se+'nda el valor ,, pero )a se (an cr'zado, as- &'e paramos. .ara terminar la divisi/n, se coloca el pivote en s' l'+ar (en el n%mero encontrado por la se+'nda b%s&'eda, el ,, &'edando: {9, 10, 4, 21, 40, 35} !! 0(ora tenemos dividido el vector en dos vectores m1s pe&'e2os: el {9, 10, 4} ) el {40, 35}, ) se repetir-a el mismo proceso.

)a im%lementaci!n es claramente recursiva1 y su%oniendo el %ivote el %rimer elemento del vector1 el %ro'rama ser5a+
3incl'de stdio.(4

void ordenar(int 5,int,int); void main() 6 77 8ar valores al arra) ; ordenar(arra),0,9!#); 77 .ara llamar a la :'nci/n

void ordenar(int 5arra),int desde,int (asta) 6 int i,d,a'<; 77 i realiza la b%s&'eda de iz&'ierda a derec(a 77 ) j realiza la b%s&'eda de derec(a a iz&'ierda. i:(desde4=(asta)

15

ALGORTMICA Estructuras estticas: arrays. Algoritmos de ordenacin de arrays.


ret'rn;

!I"A" #

:or(i=desde>#,d=(asta; ; ) 77 ?alores iniciales de la b%s&'eda. 6 :or( ;i =(asta @@ arra)[i] =arra)[desde];i>>); 77 .rimera b%s&'eda :or( ;d4=0 @@ arra)[d]4=arra)[desde];d!!); 77 se+'nda b%s&'eda i:(i d) 77 si no se (an cr'zado, intercambiar 6 a'<=arra)[i]; arra)[i]=arra)[d]; arra)[d]=a'<; ; else 77 si se (an cr'zado, salir del b'cle breaA; ; i:(d==desde!#) 77 *i la se+'nda b%s&'eda se sale del arra) es &'e el d=desde; 77 pivote es el elemento m1s pe&'e2o: se cambia con Bl mismo a'<=arra)[d]; 77 Colocar el pivote en s' posici/n arra)[d]=arra)[desde]; arra)[desde]=a'<; ordenar(arra),desde,d!#); 77 Drdenar el primer s'barra). ordenar(arra),d>#,(asta); 77 Drdenar el se+'ndo s'barra). ;

En C .ay una (unci!n $ue reali&a esta ordenaci!n sin tener $ue im%lementarla1 llamada $sort 8incluida en stdlib..:+
&sort(nombre_vector,n%mero,tama2o,:'nci/n); donde nombre_vector es el nombre del vector o array a ordenar1 n%mero es el n2mero de elementos del array o vector , tama2o indica el tama>o en bytes de cada elemento y :'nci/n es un %untero a una (unci!n $ue .ay $ue im%lementar1 $ue recibe

dos elementos y devuelve 0 si son i'uales1 al'o menor $ue 0 si el %rimero es menor $ue el se'undo1 y al'o mayor $ue 0 si el se'undo es menor $ue el %rimero. 4or e,em%lo1 el %ro'rama de antes ser5a+
3incl'de 3incl'de stdio.(4 stdlib.(4

int :'ncion(const void 5,const void 5); void main() 6 77 8ar valores al arra) ; &sort(arra),9,sizeo:(arra)[0]),:'ncion);

int :'ncion(const void 5a,const void 5b) 6 i:(5(int 5)a 5(int 5)b) ret'rn(!#); else i:(5(int 5)a45(int 5)b) ret'rn(#); else ret'rn(0); ;

16

ALGORTMICA Estructuras estticas: arrays. Algoritmos de ordenacin de arrays.

!I"A" #

Claramente1 es muc.o m*s c!modo usar la (unci!n #sort $ue im%lementar toda la (unci!n1 %ero .ay $ue tener muc.o cuidado con el mane,o de los %unteros en la (unci!n1 sobre todo si se est* traba,ando con estructuras.

1?