Está en la página 1de 5

UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN | FACULTAD DE INGENIERÍA

ESCUELA PROFESIONAL DE INGENIERÍA EN INFORMÁTICA Y SISTEMAS


ASIGNATURA: PROGRAMACIÓN AVANZADA | CICLO: SEGUNDO | SEMESTRE: 2021-II

SEMANA N°11: “MÉTODOS DE ORDENACIÓN Y BÚSQUEDA”

OBJETIVOS

● Interpretar los algoritmos de ordenación y búsqueda.


● Utilizar el paradigma orientado a objetos para dar solución al problema de la ordenación..
● Utilizar clases genéricas y tipos de datos genéricos en C++.

FUNDAMENTO TEÓRICO

¿Qué es operación de ordenación?


Es la operación de arreglar los elementos en algún orden secuencial de acuerdo a un criterio de
ordenamiento. El propósito principal de un ordenamiento es facilitar las búsquedas de los miembros del
conjunto ordenado.

El ordenar un grupo de datos significa mover los datos o sus referencias para que queden en una
secuencia por categorías y en forma ascendente o descendente.

¿Cuándo conviene usar un método de ordenación?


Cuando se requiere hacer una cantidad considerable de búsquedas y es importante el factor tiempo.

Tipos de ordenación en computación


Los dos tipos de ordenación que se pueden realizar son: los internos y los externos.

Los internos: Son aquellos en los que los valores a ordenar están en memoria principal, por lo que se
asume que el tiempo que se requiere para acceder a cualquier elemento sea el mismo (a[1], a[500], etc.).

Los externos: Son aquellos en los que los valores a ordenar están en memoria secundaria (disco duro,
cinta, pendrive, nube, etc.), por lo que se asume que el tiempo que se requiere para acceder a cualquier
elemento depende de la última posición accesada (posición 1, posición 500, etc.).

CLASIFICACIÓN DE LOS ALGORITMOS DE ORDENACIÓN INTERNA

El hecho de que la información está ordenada, nos sirve para poder encontrarla y acceder de manera más
eficiente ya que de lo contrario se tendría que hacer de manera secuencia. A continuación se describirán
tres grupos de algoritmos para ordenar información en memoria principal.

Algoritmos de intercambio: En este tipo de algoritmos se toman los elementos de dos en dos, se
comparan y se intercambian si no están en el orden adecuado. Este proceso se repite hasta que se ha
analizado todo el conjunto de elementos y ya no hay intercambios. Entre estos algoritmos se encuentran
intercambio directo (BubbleSort) y ordenación rápida (QuickSort).

Algoritmos de selección: En este tipo de algoritmos se selecciona o se busca el elemento más pequeño (o
más grande) de todo el conjunto de elementos y se coloca en su posición adecuada. Este proceso se
repite para el resto de los elementos hasta que todos son analizados. Entre estos algoritmos se encuentra
el de selección directa.

Algoritmos de inserción: En este tipo de algoritmo los elementos que van a ser ordenados son
considerados uno a la vez. Cada elemento es insertado en la posición apropiada con respecto al resto de
los elementos ya ordenados. Entre estos algoritmos se encuentran el de inserción directa, inserción
binaria, ShellSort y Hashing.

Los métodos de ordenación interna se dividen en: directos y logarítmicos

Los métodos directos: Intercambio directo y sus variantes, inserción directa (e inserción binaria) y
selección directa.

Los métodos logarítmicos: ShellSort, QuickSort (ordenación rápida), MergeSort, HeapSort, etc.
UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN | FACULTAD DE INGENIERÍA
ESCUELA PROFESIONAL DE INGENIERÍA EN INFORMÁTICA Y SISTEMAS
ASIGNATURA: PROGRAMACIÓN AVANZADA | CICLO: SEGUNDO | SEMESTRE: 2021-II

PROCEDIMIENTO

Para programar los métodos de ordenación en el lenguaje C++ se definirá una clase abstracta y un
conjunto de clases derivadas. Cada una de las clases derivadas representa uno de los métodos estudiados
en esta unidad.

Figura N°1. Diagrama de clases de métodos de ordenación


Nota: Adaptado de “Estructura de datos orientada a objetos” por Silvia Guardati.

Todos los algoritmos de ordenación utilizan dos operaciones básicas para llevar a cabo la ordenación de
los elementos de un arreglo: la comparación y el intercambio de los mismos. Por esta razón, en la clase
abstracta se incluyó el método Intercambia() que será común a todas las clases derivadas y que tendrá
por objeto intercambiar los valores de dos posiciones de un arreglo.

A continuación se muestra la manera de programar la clase base abstracta, la cual tiene una función virtual
pura que se redefinirá en cada subclase dependiendo del método de ordenación que se esté
implementando. Además, tiene una función auxiliar Intercambia() para generalizar la operación de
intercambio que será usada por las subclases.

template <class T>


class Ordenador{
public:
virtual void Ordena(T *A, int n) = 0;
void Intercambia(T *A, int ind1, int ind2);
};

template <class T>


void Ordenador<T> :: Intercambia(T *A, int ind1, int ind2){
T aux;
aux = A[ind1];
A[ind1] = A[ind2];
A[ind2] = aux;
}

Como ya se mencionó, todos los métodos utilizan dos operaciones básicas para llevar a cabo la
ordenación de los elementos: la comparación y el intercambio de los mismos. Por lo tanto, si lo que quiere
es ordenar son objetos hay que tener en cuenta que se deben sobrecargar los operadores de comparación
en las clases correspondientes.

MÉTODO DE ORDENACIÓN POR INTERCAMBIO DIRECTO

El método de intercambio directo consiste en recorrer el arreglo comparando pares de elementos e


intercambiándolos de tal manera que los valores grandes se vayan desplazando hacia la derecha del
arreglo.
UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN | FACULTAD DE INGENIERÍA
ESCUELA PROFESIONAL DE INGENIERÍA EN INFORMÁTICA Y SISTEMAS
ASIGNATURA: PROGRAMACIÓN AVANZADA | CICLO: SEGUNDO | SEMESTRE: 2021-II

Para ordenar n elementos (donde n es el número de elementos del arreglo) se realizan n-1 iteraciones por
el arreglo comparando pares de datos. Luego de cada comparación puede o no realizarse un intercambio
del contenido entre dos componentes del arreglo.

A continuación se presenta la clase InterDirDer, en la cual la función Ordena() corresponde al algoritmo


de ordenación por intercambio directo por la derecha.

template <class T>


class InterDirDer : public Ordenador<T>{
public:
void Ordena(T *A, int n);
};

template <class T>


void InterDirDer<T> :: Ordena(T *A, int n){
for(int i = 1; i <= n-1; i++)
for(int j = 1; j <= n-i; j++)
if(A[j] > A[j+1])
this->Intercambia(A,j,j+1);
}

Por razones de espacio sólo se incluye la clase InterDiDer en el siguiente trozo de código, quedando a
cargo de usted la construcción del resto del programa.

Debe tenerse en cuenta que la plantilla de la clase InterDirDer utiliza un tipo T. Si el tipo T fuera una
clase clase, entonces en dicha clase se debería sobrecargar el operador << y el operador >> para que los
objetos puedan leerse y escribirse directamente. Asimismo, deberán sobrecargarse los operadores
relacionales <, > y == para que los objetos puedan compararse tal como lo establecen los métodos de
ordenación estudiados.

class Alumno{
private:
int cod;
char nombre[40];
public:
Alumno(){}
bool operator>(Alumno);
friend istream& operator>>(istream &, Alumno &);
friend ostream& operator<<(ostream &, Alumno &);
};

bool Alumno::operator>(Alumno objA){


if(cod > objA.cod)
return true;
else
return false;
}

istream& operator>>(istream &Lee, Alumno &objA){


cout<<"Ingrese codigo: "; Lee>>objA.cod;
cout<<"Ingrese nombre: "; Lee>>objA.nombre;
return Lee;
}

ostream& operator<<(ostream &Escribe, Alumno &objA){


Escribe<<"Codigo: "<<objA.cod<<endl;
Escribe<<"Nombre: "<<objA.nombre<<endl;
return Escribe;
UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN | FACULTAD DE INGENIERÍA
ESCUELA PROFESIONAL DE INGENIERÍA EN INFORMÁTICA Y SISTEMAS
ASIGNATURA: PROGRAMACIÓN AVANZADA | CICLO: SEGUNDO | SEMESTRE: 2021-II

En el siguiente código se presenta el programa de aplicación de uno de los métodos de ordenación


estudiados hasta el momento para la ordenación de un arreglo de objetos del tipo Alumno.

int main(){
Alumno A[10];
int n;
cin>>n;
for(int i = 1; i <= n; i++){
cin>>A[i];
cout<<endl;
}

InterDirDer<Alumno> objIDD;
objIDD.Ordena(A,n);

cout<<"\nDatos ordenados"<<endl;
for(int i = 1; i <= n; i++){
cout<<A[i]<<endl;
}
return 0;
}

ANÁLISIS DE RESULTADOS

● Completar el programa anterior con todos los métodos de ordenación estudiados en la presente
unidad y probar su rendimiento.
● Independice la clase Ordenador y sus clases derivadas en un archivo header (Ordenador.h) de tal
manera que se pueda utilizar en otros programas.
● Implemente un menú de opciones con un switch-case para que el usuario seleccione el método que
desee aplicar.

INVESTIGACIÓN COMPLEMENTARIA

Implemente los métodos de búsqueda en C++ usando como base el siguiente diagrama de clases que
consta de una clase abstracta Buscador y de sus clases derivadas.

Figura N°2. Diagrama de clases de métodos de búsqueda


Nota: Adaptado de “Estructura de datos orientada a objetos” por Silvia Guardati.

Realizar lo indicado en el análisis de resultados para los métodos de búsqueda.


UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN | FACULTAD DE INGENIERÍA
ESCUELA PROFESIONAL DE INGENIERÍA EN INFORMÁTICA Y SISTEMAS
ASIGNATURA: PROGRAMACIÓN AVANZADA | CICLO: SEGUNDO | SEMESTRE: 2021-II

REFERENCIAS BIBLIOGRÁFICAS

Guardati, Silvia. Estructura de datos orientada a objetos Algoritmos con C++ . Editorial McGraw Hill,
España, 2000.

También podría gustarte