2. Índice
1. Conceptos preliminares
1.1 Clave
1.2 Criterio de ordenamiento (ó de comparación)
1.3 Registro
2. Ordenamiento de Datos
3. Cómo se sabe cuál es el mejor algoritmo
3.1 ¿Qué grado de orden tendrá la información que vas a
manejar?
3.2 ¿Qué cantidad de datos vas a manipular?
3.3 ¿Qué tipos de datos quieres ordenar?
3.4 ¿Qué tamaño tienen los registros de tu lista?
4. Concepto de ordenación
4.1 Algoritmo de ordenación básicos
4.2 Ordenación por intercambio
4.3 Ordenación por selección
4.4 Ordenación por inserción
4.4.1 Análisis del ordenamiento por el método de inserción
4.4.2 Ventajas y desventajas
4.5 Ordenación por burbuja (bubblesort)
4.5.1 Análisis del algoritmo de la burbuja
4.5.2 Ventajas y desventajas
4.6 Ordenación Shell
4.7 Ordenación rápida (quicksort)
4.7.1 Pasos que sigue el algoritmo Quicksort
4.7.2 Análisis del algoritmo quicksort
4.7.3 Ventajas y desventajas
4.8 Ordenación Binsort y Radixsort
5. Búsqueda de datos
5.1 Búsqueda secuencial
5.2 Búsqueda binaria
6. Conclusiones (mínimo dos por cada
integrante del grupo de trabajo)
7. Bibliografía
3. Introducción
Muchas actividades humanas requieren que en ellas las diferentes colecciones de elementos
utilizados se coloquen en un orden específico. Las oficinas de correo y las empresas de
mensajería ordenan el correo y los paquetes por códigos postales con el objeto de conseguir
una entrega eficiente; los anuarios o listines telefónicos ordenan sus clientes por orden alfabético
de apellidos con el fin último de encontrar fácilmente el número de teléfono deseado, El estudio
de diferentes métodos de ordenación es una tarea intrínsecamente interesante desde un punto
de vista teórico y, naturalmente, práctico. El capítulo estudia los algoritmos y técnicas de
ordenación más usuales y su implementación en C. De igual modo se estudiará el análisis de los
algoritmos utilizados en diferentes métodos de ordenación con el objetivo de conseguir la
máxima eficiencia en su uso real.
4. 1.Conceptos Preliminares
•Ordenamiento: Es la operación de arreglar los
registros de una tabla en algún orden secuencial de
acuerdo a un criterio de ordenamiento. El
ordenamiento se efectúa con base en el valor de
algún campo en un registro.
•Búsqueda: Es aquel que está diseñado para
localizar un elemento con ciertas propiedades
dentro de una estructura de datos; por ejemplo,
ubicar el registro correspondiente a cierta persona
en una base de datos.
1.1 Clave: La parte de un registro por la cual se ordena
la lista. Por ejemplo, una lista de registros con campos
nombre, dirección y teléfono se puede ordenar
alfabéticamente de acuerdo a la clave nombre. En este
caso los campos dirección y teléfono no se toman en
cuenta en el ordenamiento.
1.2 Criterio de ordenamiento (o de comparación): el
criterio que utilizamos para asignar valores a los registros
con base en una o mas claves. De esta manera decidimos
si un registro es mayor o menor que otro.
1.3 Registro: un grupo de datos que forman la lista.
Pueden ser datos atómicos (enteros, caracteres, reales,
etc.) o grupo de ellos, que en C equivalen a las
estructuras.
5. 2. Ordenamiento de datos:
Es el proceso en el cual se agrupan los registros en orden definido, con el fin de facilitar la
búsqueda de datos ordenados en secuencia. El cual puede ser numérico, alfabético o incluso
alfanumérico, ascendente o descendente.
6. 3. ¿cómo saber cuál es el que necesitas?
¿cuál es EL algoritmo?
Cada algoritmo se comporta de modo diferente de acuerdo a la cantidad y la forma en que se le
presenten los datos, entre otras cosas. No existe EL algoritmo de ordenamiento. Sólo existe el mejor
para cada caso particular. Debes conocer a fondo el problema que quieres resolver, y aplicar el más
adecuado. Aunque hay algunas preguntas que te pueden ayudar a elegir:
3.1¿Qué grado de orden tendrá la información que vas a manejar? Si la información va a estar casi
ordenada y no quieres complicarte, un algoritmo sencillo como el ordenamiento burbuja será
suficiente. Si por el contrario los datos van a estar muy desordenados, un algoritmo poderoso como
Quicksort puede ser el más indicado. Y si no puedes hacer una presunción sobre el grado de orden de
la información, lo mejor será elegir un algoritmo que se comporte de manera similar en cualquiera de
estos dos casos extremos.
7. 3.2¿Qué cantidad de datos vas a manipular?
Si la cantidad es pequeña, no es necesario utilizar un algoritmo complejo, y es preferible uno de
fácil implementación. Una cantidad muy grande puede hacer prohibitivo utilizar un algoritmo
que requiera de mucha memoria adicional.
8. 3.3¿Qué tipo de datos quieres ordenar?
Algunos algoritmos sólo funcionan con un tipo específico de datos (enteros, enteros positivos,
etc.) y otros son generales, es decir, aplicables a cualquier tipo de dato.
3.4¿Qué tamaño tienen los registros de tu lista? Algunos algoritmos realizan múltiples
intercambios (burbuja, inserción). Si los registros son de gran tamaño estos intercambios son más
lentos.
9. 4. Concepto de ordenación
La ordenación o clasificación es un proceso
de organizar un conjunto de datos en algún
orden o secuencia específica, tal como
creciente o decreciente para datos
numéricos o el orden alfabético para datos
compuestos por caracteres. Los algoritmos
de ordenación permutan los elementos del
conjunto de datos hasta conseguir dicho
orden. Para ello se basan en dos
operaciones básicas: la comparación y el
intercambio.
10. 4.1 Algoritmo de ordenación básicos
4.2 Ordenación por intercambio:
El algoritmo se basa en la lectura sucesiva de la lista a ordenar, comparando al elemento inferior
de la lista con los restantes y efectuando el intercambio de posiciones cuando el orden resultante
de la comparación no sea el correcto.
11. • Ejemplo
Tengo una lista de números 8, 4, 6, 2, la cuál tiene que convertirse al ordenarla en 2, 4,
6, 8, el algoritmo realiza n-1 pasadas, en este caso serían 3
Pasada 0
El elemento de índice 0, se compara con cada elemento posterior de
la lista de índices 1, 2 y 3. En cada comparación se comprueba si el
elemento siguiente es más pequeño que el elemento de índice 0, de
ser así los elementos se intercambian. Después de realizar todas las
comparaciones el elemento más pequeño se localiza en el índice 0.
12. Pasada 1
El elemento más pequeño se encuentra en el índice 0,
entonces vamos a comparar al elemento del índice 1 con
los elementos de los restantes posiciones 2 y3. En cada
comparación si el elemento del índice 1 es mayor que los
otros intercambian posición, así al terminar el segundo
elemento más pequeño de la lista se va a almacenar en la
posición 1
13. Pasada 2
Han quedado acomodados los dos primeros valores
de lo índices 0 y 1, por lo que ahora solo resta
valorar a los dos restantes el índice 2 y 3 resultando
lo siguiente:
14. 4.3 Ordenación por selección:
Consideremos ordenar de manera ascendente un
arreglo de enteros, suponemos que son n números.
El algoritmo se trata en sucesivas pasadas que
intercambian al elemento más pequeño
sucesivamente con el primer elemento de la lista,
después con el segundo, posteriormente con el
tercero, así sucesivamente hasta completar el
ordenamiento.
15. 4.4 Ordenación por inserción
Este ordenamiento parte del principio de que el primer
elemento está ordenado y sucesivamente se van
colocando los miembros en la posición adecuada de
acuerdo a que pueden ir antes o después del primer
miembro.
Para ser más claros, supongamos que tenemos tarjetas con
nombres los cuales queremos ordenar de forma alfabética,
tomamos la primer tarjeta, la tarjeta dos y la comparamos
con la primera, entonces decidimos si va antes o después
de la primera. Una vez colocadas ambas tarjetas, seguimos
con la tercera, la cual comparamos con la primera y
decidimos si va antes o después de la primera, si va
después entonces tendremos que comparar con la
segunda tarjeta, por lo que podrá ir Enmedio de las tarjetas
o al final de las dos primeras.
16. 4.4.1 Análisis del método por inserción:
El ordenamiento por inserción es una manera muy natural de ordenar para un ser humano, y
puede usarse fácilmente para ordenar un mazo de cartas numeradas en forma arbitraria.
La idea de este algoritmo de ordenación consiste en ir insertando un elemento de la lista ó un
arreglo en la parte ordenada de la misma, asumiendo que el primer elemento es la parte
ordenada, el algoritmo ira comparando un elemento de la parte desordenada de la lista con los
elementos de la parte ordenada, insertando el elemento en la posición correcta dentro de la
parte ordenada, y así sucesivamente hasta obtener la lista ordenada.
17. 4.4.2 Ventajas y desventajas
o Ventajas: La principal ventaja de este tipo de
ordenamiento es su simplicidad. También exhibe un
buen rendimiento cuando se trabaja con una
pequeña lista. El ordenamiento por inserción es un
algoritmo de ordenamiento en el lugar, de modo que
requiere de espacio mínimo.
o Desventajas: Su desventaja es que no funciona
tan bien como otros algoritmos mejores de
ordenamiento. Con n al cuadrado pasos
requeridos para cada n elemento a ser
ordenado, este algoritmo no funciona bien con
una lista grande. Por lo tanto, este sólo es útil
cuando se ordena una lista de pocos elementos.
18. 4.5 Ordenación por burbuja (bubblesort)
La Ordenación de burbuja (Bubble Sort en inglés) es un sencillo algoritmo de ordenamiento.
Funciona revisando cada elemento de la lista que va a ser ordenada con el siguiente,
intercambiándolos de posición si están en el orden equivocado.
También es conocido como el método del intercambio directo.
19. 4.5.1 Análisis del algoritmo de la burbuja
Al algoritmo de la burbuja, para ordenar un vector de n términos, tiene que realizar siempre el
mismo número de comparaciones:
Esto es, el número de comparaciones c(n) no depende del orden de los términos, si no del
número de términos.
20. 4.5.2 Ventajas y Desventajas
Ventajas
● Eficaz
● Sencillo
● Código reducido para
realizar el ordenamiento
Desventajas
● Consume bastante tiempo de
computadora
● Requiere muchas
lecturas/escrituras en memoria
21. 4.6 Ordenación Shell
El ordenamiento de Shell, a veces llamado “ordenamiento de
incremento decreciente”, mejora el ordenamiento por inserción
al romper la lista original en varias sub-listas más pequeñas,
cada una de las cuales se ordena mediante un ordenamiento
por inserción. La manera única en que se eligen estas sub-listas
es la clave del ordenamiento de Shell. En lugar de dividir la lista
en sub-listas de ítems contiguos, el ordenamiento de Shell usa
un incremento[i], a veces denominado brecha, para crear una
sub-lista eligiendo todos los ítems que están separados por[i
]ítems.
22. 4.7 Ordenación rápida (quicksort)
Quicksort (a veces llamado partición de intercambio especie ) es un eficiente algoritmo de clasificación ,
que actúa como un método sistemático para la colocación de los elementos de un array en orden.
Desarrollado por el informático británico , Tony Hoare en 1959 y publicado en 1961, todavía es un
algoritmo que se utiliza comúnmente para la clasificación. Cuando se aplica bien, puede ser dos o tres
veces más rápido que sus principales competidores, ordenamiento por mezcla y heapsort .
23. 4.7.1 Pasos que sigue el algoritmo Quicksort
Dividir: el arreglo se particiona en dos sub-arreglos no vacíos, tal que cada elemento de un sub-
arreglo sea menor o igual a los elementos del otro sub-arreglo.
Conquistar: los dos arreglos son ordenados llamando recursivamente a Quicksort.
Combinar: Como cada arreglo ya está ordenado, no será necesario requerir trabajo adicional.
24. 4.7.2 Análisis del algoritmo Quicksort
Se basa en la técnica divide y vencerás, que consiste en ir
subdividiendo el array en arrays más pequeños, y ordenar
éstos. Para hacer esta división, se toma un valor del array
como pivote, y se mueven todos los elementos menores
que este pivote a su izquierda, y los mayores a su derecha.
A continuación se aplica el mismo método a cada una de
las dos partes en las que queda dividido el array.
Como se dijo anteriormente, Quicksort, está basado en el
paradigma “dividir y conquistar”.
25. 4.7.3 Ventajas y Desventajas
Ventajas:
o Requiere de pocos recursos en comparación a
otros métodos de ordenamiento.
o En la mayoría de los casos, se requiere
aproximadamente N log N operaciones.
o Ciclo interno es extremadamente corto.
o No se requiere de espacio adicional durante
ejecución (in-place processing).
Desventajas :
o Se complica la implementación si la recursión
no es posible.
o Peor caso, se requiere N2.
o Un simple error en la implementación puede
pasar sin detección, lo que provocaría un
rendimiento pésimo.
o No es útil para aplicaciones de entrada
dinámica, donde se requiere reordenar una
lista de elementos con nuevos valores.
o Se pierde el orden relativo de elementos
idénticos.
26. 4.8 Ordenación Binsort y Radixsort
Ordenación Binsort:
El ordenamiento por casilleros (bucket sort
o bin sort, en inglés) es un algoritmo de
ordenamiento que distribuye todos los
elementos a ordenar entre un número
finito de casilleros. Cada casillero sólo
puede contener los elementos que
cumplan unas determinadas condiciones.
Ordenación Radixsort:
Este ordenamiento se basa en los valores de los dígitos
reales en las representaciones de posiciones de los
números que se ordenan.
Por ejemplo el número 235 se escribe 2 en la posición de
centenas, un 3 en la posición de decenas y un 5 en la
posición de unidades.
27. 5. Búsqueda de datos
Ahora nos centraremos en algunos de los problemas más comunes que surgen en la
computación, los de búsqueda y ordenamiento. En esta sección estudiaremos la búsqueda.
Regresaremos al ordenamiento más adelante en el capítulo. La búsqueda es el proceso
algorítmico de encontrar un ítem particular en una colección de ítems. Una búsqueda
normalmente devuelve True o False según el ítem esté o no presente, respectivamente. En
ocasiones, el algoritmo se puede modificar para devolver la posición donde se encuentre el ítem.
Para nuestros propósitos, simplemente nos ocuparemos de la pregunta sobre la membresía.
28. 5.1 Búsqueda secuencial
búsqueda secuencial es un método para encontrar un valor objetivo dentro de una lista. Ésta
comprueba secuencialmente cada elemento de la lista para el valor objetivo hasta que es
encontrado o hasta que todos los elementos hayan sido comparados
Búsqueda lineal es en tiempo el peor, y marca como máximo n comparaciones, donde n es la
longitud de la lista. Si la probabilidad de cada elemento para ser buscado es el mismo, entonces
la búsqueda lineal tiene una media de n/2 comparaciones, pero esta media puede ser afectado
si las probabilidades de búsqueda para cada elemento varían. La búsqueda lineal es poco
práctica porque otros algoritmos de búsqueda y esquemas, como el algoritmo de búsqueda
binaria y Tabla hash , es significativamente más rápido buscando todo menos listas cortas..
29. 5.2 Búsqueda binaria
La búsqueda de un elemento dentro de un array es una de las operaciones más importantes en
el procesamiento de información, y permite la recuperación de datos. El caso de la Búsqueda
Binaria, que es uno de las tantas búsquedas que existe, pero la más usada, está hecho para
diferentes campos en el mundo laboral, como por ejemplo una secretaria podría perder tan sólo
uno o dos minutos para encontrar el archivo de uno de los clientes de la compañía para la cual
trabaja, esto, asumiendo que los archivos estén perfectamente ordenados y catalogados.
30. Ejemplo
La búsqueda binaria funciona en arreglos ordenados. Consiste en eliminar, tras cada
comparación, la mitad de los elementos del arreglo en los que se efectúa la búsqueda, comienza
por comparar el elemento del medio del arreglo con el valor buscado. Si el valor buscado es
igual al elemento del medio, su posición en el arreglo es retornada. Si el valor buscado es menor
o mayor que el elemento del medio, la búsqueda continurá en la primera o segunda mitad,
respectivamente, dejando la otra mitad fuera de consideración; y si son iguales, se ha
encontrado dicho valor buscado y se devuelve la posición y sale del bucle; pero si no es así
seguirá buscando dicho valor dentro del bucle y hará las comparaciones necesarias hasta
encontrar el valor buscado.
31. Ejemplo en c++
using namespace std;
int main()
{
int n, i, A[30], num, primero, ultimo, medio;
cout<<"Ingrese un arreglo ordenado: ";
cout<<"Cuantos elementos te gustaria ingresar?: ";
cin>>n;
for (i=0; i>A[i];
{
cout<<"Ingrese el numero que desea buscar: ";
cin>>num;
}
primero=0;
ultimo=n-1;
meedio=(primero+ultimo)/2;
while (primero<=ultimo);
{
if (A[medio]< num);
{
primero=medio+1;
} else if (A[medio]== num)
{
cout<<" Se encontro la posición ";
cout<<medio+1;
break;
}
else {
ultimo = medio - 1;
}
medio = (primero+ultimo)/2;
}
if (primero>ultimo)
{
cout<<num<<" no se encontro";
}
return 0;
}
32. Breve explicación
Para lograr entenderlo mejor, lo explicaremos con un ejemplo:
Por ejemplo, para buscar el elemento 3 en el array {1,2,3,4,5,6,7,8,9} se realizarán los siguientes pasos:
Se toma el elemento central y se divide el array en dos:
{1,2,3,4}-5-{6,7,8,9}
Como el elemento buscado (3) es menor que el central (5), debe estar en el primer subarray:
{1,2,3,4}
Se vuelve a dividir el array en dos:
{1}-2-{3,4}
Como el elemento buscado es mayor que el central, debe estar en el segundo subarray:
{3,4}
Se vuelve a dividir en dos:
{}-3-{4}
Como el elemento buscado coincide con el central, lo hemos encontrado.
33. Conclusiones
En conclusión, se puede decir que este tema es muy importante ya sea
porque en si este puede utilizarse en la vida cotidiana de las personas en
como ponemos en práctica no formalmente como en la programación, pero
si la parte teórica sobre cómo se puede obtener algún dato o información
de algo en el método en el que lo ordenamos y como lo utilizamos para
nosotros.
También podemos recalcar que al disponer de una colección de datos
ordenados simplifica la búsqueda de información entre estos, de ahí la
importancia de las tareas de ordenación y búsqueda y la relación que existe
entre ellas.
Los métodos de ordenamiento de datos son muy útiles, ya que la forma de
arreglar los registros de una tabla en algún orden secu
encial de acuerdo a un criterio de ordenamiento, el cual puede ser
numérico, alfabético o alfanumérico, ascendente o descendente. Estos tipos
de algoritmo nos facilita las búsquedas en registro, siendo mucho mas
rápido gracias al orden de los mismos.
Mediante sus técnicas de algoritmos de ordenamiento básicos podemos
colocar listas detrás de otras y luego ordenarlas, como también podemos
comparar pares de valores de llaves, e intercambiarlos si no se encuentran
en sus posiciones correctas.
o En conclusión los algoritmos comunes de ordenamiento
pueden dividirse en dos clases según su orden de
complejidad. Por un lado, están los algoritmos de
complejidad cuadrática, entre los cuales se incluyen los
de burbujeo, de inserción de selección y por otro lado
están los de complejidad 0(n * log(n)) entre los cuales se
incluyen los algoritmos heapsort, mergesort y quicksort.
o Por otro lado no todos los algoritmos se comportan
igual ante conjunto de datos con características
particulares.
o Mediante esta pequeña investigación se logro entender
un poco mas lo que es la recursividad y sus códigos
para usar en c++, todo lo que es posible hacer con este
método de algoritmo.
o De igual manera lo que es la ordenación y búsqueda
otro tipo de sintaxis que logro aprender en esta
investigación y lo interesante que es.