2. 2.8 Definición de arreglos unidimensionales y
bidimensionales.
2.9 Búsqueda, ordenación y
mezcla de arreglos.
2.10 Estructura de datos.
2.11 Programación modular.
2.12 Definición de punteros.
2.13 Estructuras dinámicas.
Unidad II: Elementos de Programación
4. Bibliografía
Cómo programar
C/C++ y Java
Introduccción al análisis
y diseño. Editorial
Pearson Prentice Hall
Cuarta edición. 2004.
Deitel. Deitel. Capítulo 6.
Página 197.
5. Bibliografía
Curso de programación C/C++
Fco. Javier Ceballos Sierra.
Profesor titular de la Escuela Universitaria
Politécnica Universidad de Alcalá de
Henares.
Editorial RA-MA.
Páginas 492, 493, 495-498, 502, 503.
6. Bibliografía
Fundamentos de Programación con el
Lenguaje de Programación C++
Vicente Benjumea y Manuel Roldán
31 de mayo de 2017
UNIVERSIDAD DE MÁLAGA. Dpto. Lenguajes
y CC. Computación
E.T.S.I. Informática
Páginas: 85-88, 90,
7. Búsqueda, ordenación y mezcla de arreglos.
Los algoritmos para ordenar sirven para
acomodar en orden los elementos de un
conjunto. Ésto fue uno de los primeros
problemas que se estudiaron intensamente en
las ciencias de la computación. Muchas de las
aplicaciones más conocidas del paradigma de
diseño de algoritmos Divide y Vencerás son
algoritmos de ordenamiento. Durante los años
sesenta, cuando el procesamiento comercial de
datos se automatizó en gran escala, el
programa de ordenamiento era el que se
ejecutaba con mayor frecuencia en muchas
instalaciones de cómputo.
8. Búsqueda, ordenación y mezcla de arreglos.
Hay varias razones para estudiar los algoritmos
de ordenamiento. Entre ellas están:
1.Tienen utilidad práctica porque el
ordenamiento es una actividad frecuente.
2.El trabajo con conjuntos grandes de datos en
las computadoras se facilita si los datos están
ordenados.
3.Se ha ideado una buena cantidad de
algoritmos para ordenar, ya que es posible
enfocar un problema dado desde muchos
puntos de vista distintos.
9. Búsqueda, ordenación y mezcla de arreglos.
Los algoritmos a estudiar se denominan
ordenamientos internos porque se supone que
los datos están en la memoria de acceso
aleatorio de alta velocidad de la computadora.
Los algoritmos para ordenar grandes conjuntos
de datos almacenados en dispositivos de
almacenamiento, con restricciones sobre la
forma de acceder a los datos, se denominan
ordenamientos externos.
10. Búsqueda, ordenación y mezcla de arreglos.
Ejemplos:
1.Un banco ordena todos los cheques por número
de cuenta, de manera que puede preparar los
estados individuales del banco al final de cada
mes.
2.Las empresas de telefonía ordenan sus listas de
cuentas por apellido y, dentro de este
ordenamiento, hacen otro por nombre para
facilitar la búsqueda de números telefónicos.
3.Virtualmente todas las empresas deben ordenar
algún tipo de dato y, en muchos casos,
cantidades masivas de éstos.
11. Método de la burbuja:
La idea de este algoritmo consiste en hacer
repetidas pasadas sobre el array, trasladando
en cada una, el elemento más pequeño hasta el
principio del array. Este algoritmo se conoce
como ordenación por el método de la burbuja,
porque si se consideran los elementos como si
estuviera en posición vertical y fueran burbujas
con un cierto peso en un depósito de agua,
dichas burbujas irían ascendiendo en función de
su valor.
Métodos de ordenación.
12. Métodos de ordenación.
Método de la burbuja:
1. Comparamos el primer elemento con el segundo, el segundo
con el tercero, el tercero con el cuarto, etc. Cuando el
resultado de una comparación sea "mayor que'', se
intercambian los valores de los elementos comparados. Con
esto conseguimos llevar el valor mayor a la posición n.
2. Repetimos el punto 1, ahora para los n-1 primeros elementos
de la lista. Con esto conseguimos llevar el valor mayor de
éstos a la posición n-1.
3. Repetimos el punto 1, ahora para los n-2 primeros elementos
de la lista, y así sucesivamente.
4. Se termina después de repetir el proceso descrito, n-1
veces, o cuando al finalizar la ejecución del iésimo proceso
no haya habido ningún cambio.
13. Método de la burbuja:
<función clasificar(array "a" de "n" elementos)>
["a" es un array cuyos elementos son as, a1, ..., an-1]
n=n-1
DO WHILE ("a" no esté ordenado y n > 0 )
i= 1
DOWHILE(i<=n)
IF(a[i-l]>a[i])THEN permutar a[i-1] con a[i]
ENDIF
i = i+1
ENDDO
n=n-1
ENDDO
END <clasificar>
Métodos de ordenación.
14. Método de la burbuja:
#include <iostream>
using namespace std;
#include <cstdlib>
int const DIM = 10;
typedef float tArray[DIM];
void rellenarArray(tArray);
void ordenarArray(tArray);
void mostrarArray(const tArray);
Métodos de ordenación.
15. Método de la burbuja:
int main()
{tArray miArray; rellenarArray(miArray);
ordenarArray(miArray); mostrarArray(miArray);
system("PAUSE"); return 0;}
void rellenarArray(tArray miArray){
cout << "Introduzca los 10 elementos del array"
<< endl;
for (int i = 0; i < DIM; i++)
{ // Rellenamos las 10 posiciones del array
cin >> miArray[i];}}
Métodos de ordenación.
16. Método de la burbuja:
void ordenarArray(tArray miArray){
float temporal;
for (int i = 0;i < DIM; i++)
{for (int j = 0; j< DIM-1; j++){
if (miArray[j] < miArray[j+1])
{/ * Ordena el array de mayor a menor, cambiar
el "<" a ">" para ordenar de menor a mayor*/
temporal = miArray[j]; miArray[j] = miArray[j+1];
miArray[j+1] = temporal;}}}}
Métodos de ordenación.
17. Método de la burbuja:
void mostrarArray(const tArray miArray){
cout << "Mostrando array ordenado..." <<
endl;
for (int i = 0; i < DIM; i++)
// Imprime las 10 posiciones
cout << miArray[i] << endl;}
Métodos de ordenación.
18. Método de inserción:
1.Inicialmente, se ordenan los dos primeros
elementos del array.
2.Luego se inserta el tercer elemento en la
posición correcta con respecto a los dos
primeros.
3.A continuación se inserta el cuarto elemento
en la posición correcta con respecto a los tres
primeros elementos ya clasificados.
4.Y así sucesivamente hasta llegar al último
elemento del array.
Métodos de ordenación.
19. Método de inserción:
<función inserción(array "a" de "n" elementos)>
["a" es un array cuyos elementos son a0, a1, ...,
an-1]
i= 1
DOWHILE(i<n)
x = a[i]
insertar x en la posición correcta entre a0y ai
ENDDO
END <inserción>
Métodos de ordenación.
20. Método de inserción:
#include<iostream>
#include"leearreglo.h"
using namespace std;
#define largo 50
void insercionDirecta(int A[],int n)
{ int i,j,v;
for (i = 1; i < n; i++)
{ v = A[i]; j = i - 1;
while (j >= 0 && A[j] > v)
{ A[j + 1] = A[j];
j--; }
A[j + 1] = v; } }
Métodos de ordenación.
21. Método de inserción:
void main ()
{ int A[largo],n;
do{
cout<<"Cantidad de numeros a ingresar: ";cin>>n;
if(n<=0||n>largo)
cout<<"Debe ingresar un valor > a 0 y < a "<<largo<<endl;
}while(n<=0||n>largo);
leeCadena(n,A);
insercionDirecta(A,n);
muestraCadena(n,A);}
Métodos de ordenación.
22. Método de inserción:
#include<iostream>
using namespace std;
void leeCadena(int cant,int n[])
{ int i;
for(i=0;i<cant;i++)
{ cout<<"Ingresa numero "<<i+1<<": ";
cin>>n[i]; } }
Métodos de ordenación.
23. Método de inserción:
void muestraCadena(int cant,int n[])
{
int i;
for(i=0;i<cant;i++)
{
cout<<n[i]<<endl;
}
}
Métodos de ordenación.
24. Método quicksort:
1.Se selecciona un valor perteneciente al rango de
valores del array. Este valor se puede escoger
aleatoriamente o haciendo la media de un
pequeño conjunto de valores tomados del array.
El valor óptimo sería la mediana (el valor que es
menor o igual que los valores correspondientes a
la mitad de los elementos del array y mayor o
igual que los valores correspondientes a la otra
mitad). No obstante, incluso en el peor de los
casos (el valor escogido está en un extremo),
quicksort funciona correctamente.
Métodos de ordenación.
25. Método quicksort:
2.Se divide el array en dos partes, una con
todos los elementos menores que el valor
seleccionado y otra con todos los elementos
mayores o iguales.
3.Se repiten los puntos 1 y 2 para cada una de
las partes en la que se ha dividido el array,
hasta que esté ordenado,
4.El proceso descrito es esencialmente
recursivo.
Métodos de ordenación.
26. Mètodo quicksort
<función qs(array "a" )>
Se elige un valor x del array
DO WHILE ( "a" no esté dividido en dos partes )
[dividir "a" en dos partes: a_inf y a_sup]
a_inf con los elementos ai < x
a_sup con los elementos ai>= x
ENDDO
IF ( existe a_inf ) THEN
qs( a_inf )
ENDIF
IF ( existe a_sup ) THEN
qs( a_sup)
ENDIF
END <qs>
Métodos de ordenación.
28. Búsqueda lineal o secuencial:
Este método de búsqueda, aunque válido,
es el menos eficiente. Se basa en comparar
el valor que se desea buscar con cada uno
de los valores del array. El array no tiene por
qué estar clasificado.
Métodos de búsqueda.
29. Búsqueda lineal o secuencial:
Consiste en ir recorriendo secuencialmente la
colección de datos hasta encontrar el elemento
buscado o, en última instancia, hasta recorrer la
colección completa, en cuyo caso podemos
estar seguros que el elemento buscado no se
encuentra en la colección.
La búsqueda lineal es adecuada como
mecanismo de búsqueda general en
colecciones de datos sin organización conocida.
Métodos de búsqueda.
30. Búsqueda secuencial:
clase Busqueda { privado caracter vec(6)
publico cargar(caracter valor, entero i){ vec(i) = valor }
publico entero secuencial (caracter x)
{ entero bandera = 0
entero indice = 0, i = 1
Mientras ((bandera == 0 ) O ( i <= 6))
si (vec (i ) == x) Entonces bandera = 1 indice = i
Fin Si
i = i + 1
Fin Mientras
retornar indice}}
Métodos de búsqueda.
31. Búsqueda secuencial:
INICIO
{ caracter valores entero veces, resp
Busqueda obj
Para veces=1, veces, 1
Imprimir (“Teclee una letra:”)
Leer (valores)
obj.cargar (valores,veces)
Fin Para
Imprimir (“Introduzca el carácter a buscar:”)
Leer (valores)
resp= obj.secuencial (valores)
Si (resp == 0) Entonces Imprimir (“No se encontro”, valores, “ en el vector”)
De Otro Modo Imprimir (“El caracter” , valores , “ esta en la posición”, resp)
Fin Si
FIN
Métodos de búsqueda.
32. Búsqueda secuencial:
<función Búsqueda_S( array a, valor que queremos buscar)>
i=0
DO WHILE ( no encontrado )
IF ( valor = a[i] )
encontrado
ENDIF
i = i+l
ENDDO
END <Búsqueda_S>
Métodos de búsqueda.
33. Búsqueda secuencial:
int buscar_alt(int x, const Vector& v)
{int idx = int(v.size());
bool ok = false;
for (int i = 0; (i < int(v.size())) && ! ok; ++i) {
if (x == v[i]) {
ok = true;
idx = i;}
}
return idx;}
Métodos de búsqueda.
34. Búsqueda secuencial:
Como puede observarse, recorremos uno a uno
todos los elementos hasta que podemos responder
en sentido afirmativo o negativo. Respondemos en
sentido negativo (el elemento no se encuentra) si el
índice del siguiente elemento a probar está más
allá del último elemento del array. Respondemos en
sentido positivo si el elemento indicado por la
variable i contiene el elemento buscado. En tal
caso, acaba el bucle y se devuelve dicha posición i.
Nótese que si el elemento no se encuentra se
devuelve v.size(), que es una posición no válida del
array.
Métodos de búsqueda.
35. Búsqueda secuencial:
La búsqueda secuencial es simple, pero requiere
recorrer todo el array para estar seguros de que el
elemento a buscar no se encuentra en la colección. Si el
array tiene gran cantidad de elementos y necesitamos
que las búsquedas se realicen de forma rápida, este
mecanismo podría no ser adecuado. Si estamos
interesados en acelerar el proceso de búsqueda,
necesitamos información adicional que de pistas para
poder realizar una implementación más eficiente.
Necesitamos información acerca de la organización
interna de los elementos en el array. Hay diferentes
formas de organizar la información en el array que nos
permiten implemementar algoritmos de búsqueda más
eficientes.
Métodos de búsqueda.
36. Búsqueda binaria:
Un método eficiente de búsqueda, que
puede aplicarse a los arrays clasificados, es
la búsqueda binaria. Partiendo de que los
elementos del array están almacenados en
orden ascendente.
Métodos de búsqueda.
37. Búsqueda binaria:
La idea consiste en seleccionar un elemento de la
colección y comprobar si se trata del elemento
buscado. Si es así el proceso termina con éxito,
pero si no, podemos aprovechar que sabemos que
los elementos se encuentran ordenados y descartar
todos los elementos que se encuentran a la
derecha del mismo o a su izquierda (según la
relación entre el valor seleccionado y el valor
buscado). Este proceso se repite hasta encontrar el
elemento o hasta que no queden elementos en la
colección, en cuyo caso el elemento no habrá sido
encontrado.
Métodos de búsqueda.
38. Búsqueda binaria:
1. Se selecciona el elemento del centro o aproximadamente del
centro del array. Si el valor a buscar no coincide con el
elemento seleccionado y es mayor que él, se continúa la
búsqueda en la segunda mitad del array.
2. Si, por el contrario, el valor a buscar es menor que el valor
del elemento seleccionado, la búsqueda continúa en la
primera mitad del array. En ambos casos, se halla de nuevo
el elemento central, correspondiente al nuevo intervalo de
búsqueda, repitiéndose el ciclo.
3. El proceso se repite hasta que se encuentra el valor a
buscar, o bien hasta que el intervalo de búsqueda sea nulo,
lo que indicará que el elemento buscado no está en el array.
Métodos de búsqueda.
39. Búsqueda binaria:
<función Búsqueda-B( array a, valor que queremos buscar )>
DO WHILE ( exista un intervalo donde buscar )
x = elemento mitad del intervalo de búsqueda
IF(valor=x)THEN
encontrado
ELSE
IF(valor>x)THEN
buscar "valor" en la segunda mitad del intervalo de búsqueda
ENDIF
IF(valor<x)THEN
buscar "valor" en la primera mitad del intertalo de búsqueda
ENDIF
ENDIF
ENDDO
END <Búsqueda_B>
Métodos de búsqueda.
40. Búsqueda binaria:
/* busca la posición del primer elemento igual a x, si no se
encuentra, retorna v.size()*/
unsigned buscar_bin(int x, const Vector& v)
{unsigned i = 0 ;
unsigned f = v.size() ;
unsigned m = (i + f) / 2 ;
while ((i < f) && (x != v[m])) {
if (x < v[m]) {f = m ;} else {i = m + 1 ;}
m = (i + f) / 2 ;}
if (i >= f) {m = int(v.size());}
return m;
}
Métodos de búsqueda.