Prctica 3: Ordenar de manera ascendente un conjunto de
nmeros de punto flotante almacenados en un arreglo.
Introduccin. Como ya se mencion, uno de los procedimientos ms comunes y tiles en el procesamiento de datos, es la clasificacin u ordenacin de los mismos. Se considera ordenar al proceso de reorganizar un conjunto dado de objetos en una secuencia determinada. El objetivo de este proceso generalmente es facilitar la bsqueda de uno o ms elementos pertenecientes a un conjunto. Como, ejemplo considrese las listas de alumnos matriculados en una cierta asignatura, las listas del censo, los !ndices alfabticos de los libros, las gu!as telefnicas, etc. Esto quiere decir que muc"os problemas estn relacionados de alguna forma con el proceso de ordenacin. Es por lo que la ordenacin es un problema importante a considerar. #a ordenacin, tanto numrica como alfanumrica, sigue las mismas reglas que empleamos nosotros en la vida normal. Esto es, un dato numrico es mayor que otro, cuando su valor es ms grande, y una cadena de caracteres es mayor que otra, cuando por orden alfabtico est despus. Se pueden agrupar los mtodos de ordenacin en dos grandes categor!as$ ordenacin de arreglos u ordenacin interna, cuando los datos se guardan en memoria interna, y ordenacin de arc"ivos u ordenacin e%terna, cuando los datos se guardan en memoria e%terna, generalmente en discos. Objetivo. Elaborar diferentes algoritmos de programas en lenguaje C que soliciten y almacenen en un arreglo, nmeros de punto flotante y sobre ste, ordenarlos ascendentemente. #os algoritmos que se consideran son los de ordenacin por$ &todo de la burbuja. &todo de S"ell Sort &todo de 'nsercin &todo de (uic) Sort. Consideraciones tericas. En la presente prctica se considera el uso de las estructuras repetitivas *"ile y for+ entonces se presentar su estructura en lenguaje C, en diagrama de flujo y en una forma que resulta conveniente para describir los algoritmos aparte de los diagramas de flujo, esta forma es en pseudocdigo, por tanto, se describe lo que es el pseudocdigo. ,ambin como los datos se almacenarn en arreglos y se ordenan sobre ste, se describe lo que es un arreglo, las clases de ellos y la manera de definirlos en lenguaje C. Pseudocdigo. Segn -./, el pseudocdigo es un lenguaje artificial e informal que ayuda a los programadores a desarrollar algoritmos. El pseudocdigo es similar al lenguaje cotidiano+ es cmodo y amable con el programador, aunque no es realmente verdadero lenguaje de computadora. 0o se ejecutan en las computadoras, mas bien sirven para ayudar al programador a razonar un programa antes de intentar escribirlo en algn lenguaje. 1n programa escrito en pseudocdigo puede ser fcilmente codificado en un programa en C, si est bien elaborado.
2or ejemplo supongamos que la nota para aprobar un e%amen es de 3. El enunciado en pseudocdigo ser!a$ Si calificacin 45 36 entonces &ostrar 78probado7 9inSi El mismo enunciado se puede escribir en C como$ 0tese que la operacin de trasladar el pseudocdigo a cdigo fuente, se realiza con un m!nimo de esfuerzo, no se necesita de un mayor anlisis. #levando el ejemplo anterior a pseudocdigo. Se puede refinar an ms el algoritmo$ 'nicializar variables. 'nicializar los aprobados :aprobados; en 6 'nicializar los reprobados :reprobados; en 6 'nicializar el nmero de estudiantes :estudiantes; en 6 'ntroducir las primeras <6 calificaciones y contar los aprobados y los reprobados. &ientras :*"ile; el contador de estudiantes es menor o igual que <6 entonces
'ntroducir el siguiente resultado de e%amen Si el estudiante aprob
Sumar < a aprobados Si no Sumar < a reprobados 9inSi Sumar < al contador estudiantes 9in&ientras 'mprimir un resumen de los resultados de e%menes y decidir si se debe aumentar o no la colegiatura. 'mprimir el nmero de aprobados 'mprimir el nmero de reprobados Si estudiantes es ms = entonces 'mprimir 78umentar la colegiatura7. 9inSi Simplificando el problema, el pseudocdigo puede ser escrito en la siguiente forma$ if : calif 45 36 ; printf:>8probado?;+ 8 continuacin se describen las estructuras *"ile y for, en lenguaje C, en diagrama de flujo y en pseudocdigo. Estructura !ile. "#$ #a estructura *"ile ejecuta una sentencia, simple o compuesta, cero o ms veces, dependiendo del valor de una e%presin. Su forma es como sigue$ !ile :e%presin; sentencia+ donde$ e%presin, es cualquier e%presin numrica, relacional o lgica y sentencia, es una sentencia simple o compuesta. #a ejecucin de la estructura *"ile sucede as!$ Se evala la e%presin. Si el resultado de la e%presin es cero :flaso;, la sentencia no se ejecuta y se pasa a ejecutar la siguiente sentencia en el programa. Si el resultado de la e%presin es distinto de cero :verdadero;, se ejecuta la sentencia y el proceso se repite comenzando en el punto <. Su representacin en pseudocdigo -./ es$ &ientras e%presin accin < accin @ . . accin n 9in&ientras 6 A tambin como$ &ientras e%presin "acer accin < accin @ . . accin n 9in &ientras Su representacin en diagrama de flujo -B/$ no
si Estructura for. Cuando se desea ejecutar una sentencia simple o compuesta, repetidamente un nmero de veces conocido, la construccin adecuada es la estructura for -</. Su forma es como sigue$ for:v 5 e+ condicin+ progresin; sentencia+ v 5 e v representa una variable que ser inicializada con el valor de la e%presin e. condicin es una e%presin de Coole :operandos unidos por operadores relacionales yDo lgicos;. Si se omite, se supone siempre que es verdadera. progresin es una e%presin cuyo valor evoluciona en el sentido de que se d la condicin para finaliE zar la ejecucin de la sentencia for. sentencia es una sentencia simple o compuesta. #a ejecucin de la estructura for sucede de la siguiente manera$ <. Se inicializa la variable v. @. Se evala la e%presin de Coole :condicin;. @.< Si el resultado es distinto de cero :verdadero;, se ejecuta la sentencia, se evala la e%presin que da lugar a la progresin de la condicin y se vuelve al punto @. @.@ Si el resultado de @ es cero :falso;, la ejecucin de la sentencia for se da por finalizada y se Contina en la siguiente sentencia del programa. e%presin Sentencia :simple o compuesta; Su representacin en pseudocdigo es$ para !asta n !acer accin < accin @ . . accin n fin para
El cual equivalente a lo siguiente$ mientras !acer acciones
fin mientras Su representacin en diagrama de flujo -B/$
si no 8 continuacin es menciona lo que es un arreglo y como se definen en lenguaje C. -</ 1n arreglo es una estructura "omognea, compuesta por varias componentes, todas del mismo tipo y almacenadas consecutivamente en memoria. Cada componente puede ser accedido directamente por el nombre de la variable arreglo seguido de uno o ms sub!ndices encerrados entre corc"etes. #a representacin de los arreglos se "ace mediante variables suscritas o de sub!ndices y pueden tener una o varias dimensiones :sub!ndices;. 8 los arreglos de una dimensin se les llama tambin listas+ y a los de dos dimensiones, tablas. Fesde el punto de vista matemtico, se necesita representar variables, tales como$ a< a@ a. G an en el caso de un sub!ndice+ o bien, v e condicin sentencia :simple o compuesta; a<< a<@ a<. G a<n a@< a@@ a@. G a@n GGGGGGGGGG.. ain ai@ ai. ... ain si se utilizan dos sub!ndices. 2ara realizar esta misma representacin bajo C, se debe recurrir a los arreglos. #os sub!ndices de un arreglo son enteros consecutivos, y el primer sub!ndice vale 6. un sub!ndice puede ser cualquier e%presin entera. 1n arreglo de dos dimensiones se representa mediante una variable con dos sub!ndices :filas, columnas;+ un arreglo de tres dimensiones mediante una variable con tres sub!ndices y as! sucesivamente. El nmero m%imo de elementos para un arreglo depende de la memoria disponible. %eclaracin de un arreglo. #a declaracin de un arreglo especifica el nombre del arreglo, el nmero de elementos del mismo y el tipo de stos. #a declaracin de un arreglo unidimensional, se "ace de la siguiente manera$ tipo nombre -tamaHo/+ tipo nombre - /+ tipo indica el tipo de elementos del arreglo. 2uede ser cualquier tipo e%cepto void. nombre es un identificador que nombra al arreglo. tamaHo es una constante que especifica el numero de elementos del arreglo. El tamaHo puede omitirE se cuando se inicializa el arreglo, cuando se declara como un parmetro formal en una funE cin o cuando se "ace referencia a un arreglo declarado en otra parte del programa. #a declaracin de un arreglo de varias dimensiones se "ace de la siguiente forma$ tipo nombre -e%prEcte/ G + tipo nombre - /-e%prEcte/ G + #a primera e%prEcte puede omitirse cuando se inicializa el arreglo, cuando se declara como un parmetro formal en una funcin o cuando se "ace referencia a un arreglo declarado en otra parte del programa. &aterial ' e(uipo. 2ara el desarrollo de la presente prctica se utiliz el siguiente equipo$ 1na computadora personal con el programa Iisual CJJ 3.6 previamente instalado, aunque puede ser otro compilador C o CJJ que cumpla con la norma 80S' C. %esarrollo. Como se mencion en los objetivos de esta prctica, se utilizarn los mtodos de la burbuja, el de s"ell sort, el de insercin y el de quic) sort para ordenar de manera ascendente datos de tipo flotante en un arreglo. 2ara cada uno de stos mtodos se describe brevemente la idea de ordenacin, se muestra su algoritmo en pseudocdigo y su codificacin en lenguaje C. &)todo de la burbuja. Segn -@/, partiendo de que los datos a ordenar estn en una lista de n elementos, la ordenacin se "ace como sigue$ <. Se comparan el primer elemento con el segundo, el segundo con el tercero, el tercero con el cuarto, etc. Cuando el resultado de una comparacin es >mayor que >, se intercambian los valores de los elementos comparados. Con esto se consigue llevar el valor mayor a la posicin n. @. Se repite el punto <, a"ora para los nE< primeros elementos de la lista. Con esto se consigue llevar el valor mayor de stos a la posicin nE<. .. Se repite el punto <, a"ora para los nE@ primeros elementos de la lista y as! sucesivamente. B. El proceso termina despus de repetir el punto <, nE< veces, o cuando al finalizar la ejecucin del punto < no "aya "abido ningn cambio. El algoritmo descrito en pseudocdigo es como sigue$ 'nicio &ostrar peticin para introducir el nmero de datos a ordenar #eer nKdatos &ostrar peticin para introducir los datos 2ara i 6 "asta nKdatosE< "acer #eer arreglo-i/ 9in 2ara 2ara n nKdatos "asta <
2ara i < "asta n Si arreglo-iE</ 4 arreglo-i/ au% arreglo-iE</ arreglo-iE</ arreglo-i/ arreglo-i/ au% 9in Si 9in 2ara 9in 2ara &ostrar mensaje$ Fatos ordenados 2ara i 6 "asta nKdatosE< &ostrar arreglo-i/ 9in 2ara 9in 'nicio #a codificacin en lenguaje C es como sigue$ DD 2rograma que solicita y almacena en una variable entera el nmero DD de datos a ordenar. Solicita y almacena en un arreglo, nmeros de DD punto flotante y sobre el arreglo los ordena de manera ascendente DD utilizando el mtodo de la burbuja Linclude Mstdio."4 Linclude Mconio."4 Ldefine &8N <66< main:; O float arreglo-&8N/, au%+ int nKdatos,n,i+ printf:7'ntroduzca el nmero de datos a ordenar$Pt7;+ scanf:7Qd7,RnKdatos;+ printf:7Pn'ntroduzca los datos$Pn7;+ for:i56+iMnKdatos+iJJ; scanf:7Qf7,Rarreglo-i/;+
for:n5nKdatosE<+n45<+nEE; for:i5<+iM5n+iJJ; if:arreglo-iE</4arreglo-i/; O au%5arreglo-iE</+ arreglo-iE</5arreglo-i/+ arreglo-i/5au%+ S
printf:7Pn#os datos ordenados son$Pn7;+ for:i56+iMnKdatos+iJJ; printf:7Q.@fPt7,arreglo-i/;+ getc":;+ return 6+ S &)todo de *!ell *ort. Segn -@/, el mtodo de s"ell sort es considerado ms eficiente que el mtodo de la burbuja. Como primer paso este mtodo coloca los elementos apro%imadamente en la posicin en la cual quedarn ordenados al final y, despus determina la colocacin e%acta de stos. #a fortaleza de este mtodo se encuentra en la forma en como determina la posicin final apro%imada de los elementos. El concepto clave de este mtodo es el intervalo o espacio :t"e gap;, el cual es la distancia entre los elementos comparados. 2or ejemplo, si este intervalo es de T, el primer elemento es comparado con el se%to elemento, el segundo con el sptimo, el tercero con el octavo y as! sucesivamente. Supongamos que el valor del intervalo es de ., entonces se compara el elemento < con el elemento B, el elemento @ con el elemento T, el elemento . con el 3, el elemento B con el U y as! sucesivamente. 8"ora supongamos que el elemento U es mayor que el elemento <6, entonces "abr un intercambio de valores entre estas posiciones. 8"ora la comparacin retrocede en posiciones y como el valor del intervalo es de ., entonces se compara el valor del elemento U con el del elemento B, si no "ay intercambio entre stos, se compara el elemento B con el elemento <. una vez realizada sta comparacin se compara el elemento <6 con el <. y as! sucesivamente. 8s! en nico paso a lo largo del arreglo, para cierto valor del intervalo, todos los elementos comparados son colocados en orden, es decir, el arreglo que da ordenado de manera apro%imada. 8 la posicin final. El siguiente paso es disminuir el valor del intervalo y se "acen comparaciones, si a"ora el valor del intervalo es @ y se compara el elemento < con el elemento ., el elemento @ con el B y as! sucesivamente. Si "ay un intercambio se realizan comparaciones retrocediendo posiciones. Fespus nuevamente se compara el valor del elemento del primer intercambio con su elemento adyacente segn el valor del intervalo, y as! sucesivamente "asta el final del arreglo. #as ltimas comparaciones a lo largo del arreglo se realizan cuando el valor del intervalo es de <, el cual da por resultado la clasificacin completa del arreglo. El valor inicial del intervalo :gap; es arbitrario pero es comn inicializarlo con el valor entero que resulte de dividir a la mitad el nmero de elementos del arreglo. 8l terminar cada paso completo por el arreglo, el valor del intervalo se divide nuevamente a la mitad y as! sucesivamente "asta que su valor sea de 6. E%isten muc"as versiones del mtodo de s"ell sort que var!an en complejidad y eficiencia. #a versin que se presenta en la presente prctica se considera e%tremadamente eficiente, ya que requiere pocos pasos para la clasificacin completa del arreglo. El algoritmo descrito en pseudocdigo es el siguiente$ 'nicio &ostrar peticin para introducir el nmero de elementos #eer n &ostrar peticin para introducir los datos 2ara i < "asta n "acer #eer arreglo-i/ intervalo nD@ &ientras intervalo 4 6 "acer 2ara i intervaloJ< "asta n "acer j iEintervalo &ientras j 4 6 "acer ) jJintervalo Si arreglo-j/ V arreglo-)/ entonces j 6 Si no au% arreglo-j/ arreglo-j/ arreglo-)/ arreglo-)/ au% j jEintervalo 9inSi 9in &ientras 9in2ara intervalo intervaloD@ 9in2ara &ostrar el mensaje$ Fatos ordenados 2ara i < "asta n "acer &ostrar arreglo-i/ 9in'nicio Su codificacin en lenguaje C es como sigue$ DD 2rograma que solicita y almacena en una variable entera el nmero DD de datos a ordenar. Solicita y almacena en un arreglo, nmeros de DD punto flotante y sobre el arreglo los ordena de manera ascendente DD utilizando el mtodo de S"ell Sort Linclude Mstdio."4 Linclude Mconio."4 Ldefine &8N <66 main:; O float arreglo-&8N/, au%+ int n,i,j,),inc+
printf:7'ntroduzca el nmero de datos a ordenar$Pt7;+ scanf:7Qd7,Rn;+ printf:7Pn'ntroduzca los datos$Pn7;+ for:i5<+iM5n+iJJ; scanf:7Qf7,Rarreglo-i/;+ inc5nD@+ *"ile:inc46; O for:i5incJ<+iM5n+iJJ; O j5iEinc+ *"ile:j46; O )5jJinc+ if:arreglo-j/M5arreglo-)/; j56+ else O au%5arreglo-j/+ arreglo-j/5arreglo-)/+ arreglo-)/5au%+ jE5inc+ S S S incD5@+ S printf:7PnFatos ordenados$Pn7;+ for:i5<+iM5n+iJJ; printf:7Q.@fPt7,arreglo-i/;+
getc":;+ return 6+ S &)todo de insercin. #os pasos de est mtodo son los siguientes -</$ <. 'nicialmente, se ordenan los dos primeros elementos del arreglo. @. #uego se inserta el tercer elemento en la posicin correcta con respecto a los dos primeros. .. 8 continuacin se inserta el cuarto elemento en la posicin correcta con respecto a los tres primeros elementos ya clasificados y as! sucesivamente "asta llegar al ltimo elemento del arreglo. El algoritmo desarrollado en pseudocdigo es como sigue$ 'nicio Feclarar las variables arreglo-/, n, i, ), % &ostrar peticin para introducir el nmero de elementos #eer n &ostrar peticin para introducir los datos 2ara i 6 "asta nE< "acer #eer arreglo-i/ 9in 2ara
2ara i < "asta nE< "acer % arreglo-i/ ) iE< &ientras ) W 6 y % M arreglo-)/ "acer arreglo-)J</ arreglo-)/ ) )E< 9in &ientras arreglo-)J</ % 9in 2ara &ostrar el mensaje$ >Fatos ordenados? 2ara i 6 "asta nE< "acer &ostrar arreglo-i/ 9in 2ara 9in 'nicio X la codificacin en C es como sigue$ DD2rograma que solicita y almacena en una variable entera el nmero de datos a ordenar. DDSolicita y almacena en un arreglo, nmeros de punto flotante y sobre el arreglo DDlos ordena de manera ascendente utilizando el mtodo de insercin Linclude Mstdio."4 Linclude Mconio."4 Ldefine 0&8N <66 main:; O int n,i,)+ float arreglo-0&8N/,%+ printf:7'ntroduzca el nmero de elementos a ordenar$Pt7;+ scanf:7Qd7,Rn;+ printf:7Pn'ntroduzca los elementos$Pn7;+ for:i56+iMn+iJJ; scanf:7Qf7,Rarreglo-i/;+ for:i5<+iMn+iJJ; O %5arreglo-i/+ )5iE<+ *"ile:)456 RR %Marreglo-)/; O arreglo-)J</5arreglo-)/+ )EE+ S arreglo-)J</5%+ S printf:7PnElementos ordenados$Pn7;+ for:i56+iMn+iJJ; printf:7Q.@fPt7,arreglo-i/;+ getc":;+ return 6+ S &)todo de +uic, *ort. El mtodo de ordenacin de quic) sort, est generalmente considerado como el mejor algoritmo de ordenacin disponible en la actualidad.
#os pasos correspondientes a este mtodo,es el siguiente -</ y -@/$ <. Se selecciona un valor del arreglo. Este valor se puede escoger aleatoriamente o "aciendo la media de un pequeHo conjunto de valores tomados del arreglo. El valor ptimo ser!a aquel que est precisamente en medio del rango de valores :mediana;. 0o obstante, incluso en el peor de los casos :el valor escogido est en un e%tremo;, este mtodo funciona correctamente. @. Se divide el arreglo en dos partes, una con todos los elementos menores que el valor seleccionado y otra con todos los elementos mayores o iguales. .. Se repiten los puntos < y @ para cada parte restante "asta que el arreglo est ordenado. Este proceso es esencialmente recursivo, es decir, utiliza una funcin a la cual se le llama dentro de su misma definicin. El algoritmo desarrollado en pseudocdigo es como sigue$ 'nicio Feclarar las variables i, n y arreglo-/ &ostrar peticin para introducir el nmero de elementos #eer n &ostrar peticin para introducir los datos 2ara i 6 "asta nE< "acer #eer arreglo-i/ 9in 2ara #lamar a la funcin ordenar pasando las variables arreglo, 6 y nE< &ostrar el mensaje$ >Fatos ordenados? 2ara i 6 "asta nE< "acer &ostrar arreglo-i/ 9in 2ara 9in 'nicio 'nicio funcin ordenar Yecibir en las variables arreglo-/, inf y sup a las variables arreglo, 6 y nE< respectivamente Feclarar las variables izq, der, mitad y au% izq inf der sup mitad arreglo-:izqJder;D@/ Yepetir &ientras mitad 4 arreglo-i/ y sup 4 izq "acer izq izqJ< 9in &ientras &ientras mitad M arreglo-der/ y inf M der "acer der derE< 9in &ientras Si izq V der entonces au% arreglo-izq/ arreglo-izq/ arreglo-der/ arreglo-der/ au% izq izqJ< der derE< 9in Si &ientras izq V der
Si inf M der #lamar a la funcin ordenar pasando las variables arreglo, inf y der 9in Si Si izq M sup #lamar a la funcin ordenar pasando las variables arreglo, izq y sup 9in Si 9in funcin ordenar #a codificacin del algoritmo en C es como sigue$ DDEl mismo programa utilizando el mtodo de (uic) Sort Linclude Mstdio."4 Linclude Mconio."4 Ldefine 0&8N <66 void ordenar:float-/,int,int;+ main:; O int i,n+ float arreglo-0&8N/+ printf:7'ntroduzca el nmero de elementos a ordenar$Pt7;+ scanf:7Qd7,Rn;+ printf:7Pn'ntroduzca los elementos$Pn7;+ for:i56+iMn+iJJ; scanf:7Qf7,Rarreglo-i/;+ ordenar:arreglo,6,nE<;+ printf:7PnElementos ordenados$Pn7;+ for:i56+iMn+iJJ; printf:7Q.@fPt7,arreglo-i/;+ getc":;+ return 6+ S void ordenar:float arreglo-/,int inf,int sup; O int izq,der+ float au%,mitad+ izq5inf+ der5sup+ mitad5arreglo-:izqJder;D@/+ do O *"ile:mitad4arreglo-izq/ RR sup4izq; izqJJ+ *"ile:mitadMarreglo-der/ RR infMder; derEE+ if:izqM5der; O au%5arreglo-izq/+ arreglo-izq/5arreglo-der/+ arreglo-der/5au%+ izqJJ+ derEE+ S S *"ile:izqM5der;+ if:infMder; ordenar:arreglo,inf,der;+ if:izqMsup; ordenar:arreglo,izq,sup;+ S -esultados. ,ras la compilacin y enlace de cada uno de los programas, se realizaron varias ejecuciones de estos. 8 continuacin mostramos una ejecucin de cada uno$ <; &todo de la burbuja$ @; &todo de s"ell sort$ .; &todo de insercin$ B; &todo de quic) sort$ Conclusiones. 2ara probar la efectividad de cada programa se introdujeron T66 datos en el mismo orden y el nico tiempo que se logr medir fue el del mtodo de la burbuja, el cual fue de 6.6TBZBT s. El tiempo medido para los dems programas fue de 6.666666 s. Fe este "ec"o se concluy que el mtodo ms lento es el de la burbuja y no se logr registrar el tiempo de los dems debido a la rapidez de la ordenacin. 2ara lograr registrar :medir; algn tiempo con los mtodos de s"ell sort, insercin y quic) sort se deben ordenar ms datos. En la siguiente seccin de la prctica se propone introducir <666 datos para poder apreciar algn tiempo de ordenacin para los mtodos mencionados. Ejercicio propuesto. &edir el tiempo que tarda cada programa para ordenar <666 datos. Estos datos sern los mismos para cada uno de los cuatro programas y se introducirn en el mismo orden. [Cul es el tiempo que tarda cada programa en ordenar los datos \, [cul es el programa ms eficiente\, [cul el ms lento\ .ibliograf/a ' referencias. -</ 9rancisco ]avier Ceballos Curso de programacin C Ed. 8ddison ^esley 'beroamericana -@/ Step"en _. A`Crien ,urbo 2ascal T.T ,"e Complete Yeference &cara* bill -./ "ttp$DDes.*i)ipedia.orgD*i)iD2seudocQC.QC.digo "ttp$DD***.desarrollo*eb.comDarticulosD@@@T.p"p -B/ 9ernndo Iirgs ,cnicas y elementos de programacin. ,ercera edicin revisada. Ed. austavo aili