Revista Nexos Científicos
Julio-Diciembre 2022 pp. 01-11
Volumen 1, Número 2
Fecha de recepción: agosto 2022
ISSN: 2773-7489
Correo: editor@istvidanueva.edu.ec
URL: http://nexoscientificos.vidanueva.edu.ec/index.php/ojs/index
Fecha de aceptación: octubre 2022
1
1.
1
INTRODUCCIÓN
Hoy en día la programación es un elemento muy
importante dentro del área de la Computación para
desarrollar desde funciones muy sencillas hasta el
desarrollo de juegos. Ordenar un conjunto de
1. msalazar@uisrael.edu.ec
2. fgbl_02@hotmail.com
elementos de una lista es una tarea que se presenta
con frecuencia ya que la información al estar
ordenada nos servirá para poder encontrarla y
acceder de manera más eficiente, porque de lo
contrario se tendría que hacer de manera secuencial.
A menudo, un ser humano puede realizar esta tarea
Métodos de ordenamiento usando hilos en el entorno de desarrollo NETBEANS
Marta Salazar
1
; Fabiola Bucheli
2
1
Universidad Tecnológica Israel, Quito-Ecuador, msalazar@uisrael.edu.ec
2
Universidad Técnica Particular de Loja, Quito-Ecuador, fgbl_02@hotmail.com
Resumen: Los algoritmos de ordenamiento nos permiten, como su nombre lo dice, ordenar. En este caso, se
emplearon los métodos de ordenamiento Bubble Sort, Quick Sort y Shell Sort usando hilos en un ambiente
gráfico en Java con el fin de analizar la cantidad de comparaciones que suceden y el tiempo que demora cada
algoritmo en ordenar un arreglo numérico generado de manera aleatoria. Se seleccionaron estos métodos por
ser muy populares y presentar características muy distintivas a la hora de ordenar. El método burbuja es un
simple algoritmo de ordenamiento que emplea simples iteraciones para llevar a cabo el intercambio de dos
elementos adyacentes y así colocarlos en el lugar correcto. Por otra parte, el método rápido funciona con la
técnica de algoritmo de división y ganancia en la que un elemento fundamental se convierte en el punto focal
de división alrededor del arreglo dado. Por último, el método de ordenamiento Shell el cual consiste en dividir
el arreglo en bloques de varios elementos para organizarlos después por medio del ordenamiento de inserción
directa. En el presente trabajo se conocerá el proceso empleado para llevar a cabo la comparación entre estos
tres métodos los cuales tienen que ser dominados por los estudiantes de la carrera a la hora de darle solución a
muchos de los problemas que son necesarios resolver para que ciertas máquinas y programas que utilizan estos
algoritmos empiecen a funcionar en el momento y en la forma que se desea.
Palabras clave: Bubble Sort, Quick Sort, Hilos, Java
Sort methods using threads in the netbeans development environment
Abstract: Sorting algorithms allow us, as the name says, to sort. In this case, the Bubble Sort, Quick Sort and
Shell Sort sorting methods were used using threads in a graphical environment in Java in order to analyze the
number of comparisons that occur and the time it takes for each algorithm to sort a generated numerical array.
randomly. These methods were selected because they are very popular and have very distinctive characteristics
when ordering. The bubble method is a simple sorting algorithm that uses simple iterations to swap two adjacent
elements to place them in the correct place. On the other hand, the fast method works with the split-and-gain
algorithm technique in which a fundamental element becomes the focal point of splitting around the given
array. Finally, the Shell ordering method which consists of dividing the array into blocks of several elements
to organize them later by means of direct insertion ordering. In the present work, the process used to carry out
the comparison between these three methods will be known, which have to be mastered by the students of the
career when it comes to solving many of the problems that are necessary to solve so that certain machines and
programs that use these algorithms start working when and in the way you want.
Keywords: Bubble Sort, Quick Sort, Threads, Java.
Revista Nexos Científicos
Julio-Diciembre 2022 pp. 01-11
Volumen 1, Número 2
Fecha de recepción: agosto 2022
ISSN: 2773-7489
Correo: editor@istvidanueva.edu.ec
URL: http://nexoscientificos.vidanueva.edu.ec/index.php/ojs/index
Fecha de aceptación: octubre 2022
2
de forma intuitiva. Sin embargo, un programa de
computadora debe seguir una secuencia de
instrucciones exactas para lograrlo. Esta secuencia
de instrucciones se llama algoritmo. Existen varios
algoritmos de ordenamiento y difieren en cuanto a
su eficiencia y rendimiento. Algunos algoritmos
importantes y conocidos son el ordenamiento de
burbuja, ordenamiento por selección, por inserción
y el ordenamiento rápido.
El presente trabajo surge de la necesidad de estudiar
los métodos de ordenamiento: Bubble Sort, Quick
Sort y Shell Sort. El propósito principal es hacer uso
de estos algoritmos implementando hilos en el
lenguaje de programación Java e identificar la
importancia del uso de estos como parte esencial
para resolver problemas. Además, se busca
desarrollar el pensamiento lógico y capacidad de
análisis, cualidades que son indispensables a la hora
de programar y tener el mayor dominio posible
dentro del área de desarrollo.
La investigación busca proporcionar información
que será de utilidad para toda la comunidad
educativa para así mejorar el conocimiento sobre el
problema planteado. Además, es conveniente para
afianzar un mayor conocimiento sobre estos
métodos de ordenamiento ya que son una
herramienta fundamental para ordenar vectores o
matrices.
2. METODOLOGÍA
El presente trabajo “MÉTODOS DE
ORDENAMIENTO USANDO HILOS EN EL
ENTORNO DE DESARROLLO NETBEANS”
corresponde a un proyecto en el cual se realizó una
indagación bibliográfica, utilizando los
descriptores: escritura científica, mapas
conceptuales, lectura crítica, a través de la
exploración en internet con el buscador “Google
académico” con los términos del tema a investigar.
Por otro lado, la investigación a realizarse es de tipo
explicativa, por cuanto determinará las relaciones
entre las variables, estableciendo los factores que
pueden explicar los fenómenos que se estudian.
2.1.Planificación
Para desarrollar el proyecto se empleó el entorno de
desarrollo integrado libre hecho principalmente para
el lenguaje de programación Java, NetBeans, ya que
puede ser usado para desarrollar cualquier tipo de
aplicación, es gratis, permite el uso de herramientas
para crear interfases gráficas y por ser el entorno de
desarrollo con el que se trabaja en clases. Se
emplearon los métodos de ordenamiento Bubble
Sort, Quick Sort y Shell Sort usando hilos para
poder cuantificar el tiempo y el número de
intercambios que realiza cada uno a la hora de
ordenar un arreglo numérico y así poder mostrar de
manera grafica el proceso de ordenamiento que
ocurre detrás del funcionamiento de estos tres
algoritmos.
2.2.Diseño
En el apartado gráfico se realizó una interfaz
amigable para el usuario. Se creó un entorno visual
fácil de usar empleando botones que representan la
información y acciones que se encuentran en la
interfaz y un área de texto en donde visualizar todo
el proceso de ordenamiento. JFrame es la ventana
principal de nuestra aplicación gráfica y en ella
podemos ver los típicos controles de una ventana de
Windows como el de cerrar, maximizar o
minimizar.
Ilustración 1 Interfaz Gráfica
Fuente: Elaborado por el autor
2.3.Desarrollo
Para desarrollar la aplicación se creó una clase
llamada OrdenamientoConHilos. Se utilizó la
palabra clave extends para indicar que la clase que
se está definiendo se derivaría mediante herencia de
JFrame una clase utilizada en Swing (biblioteca
gráfica) para generar ventanas sobre las cuales
añadir distintos objetos con los que podrá
interactuar o no el usuario. Además se utilizó
Revista Nexos Científicos
Julio-Diciembre 2022 pp. 01-11
Volumen 1, Número 2
Fecha de recepción: agosto 2022
ISSN: 2773-7489
Correo: editor@istvidanueva.edu.ec
URL: http://nexoscientificos.vidanueva.edu.ec/index.php/ojs/index
Fecha de aceptación: octubre 2022
3
implements para implementar la interfaz
ActionListener que se encuentra en el paquete
java.awt.event y así crear un programa dinámico y
permitir la interacción del usuario.
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.Random;
El nivel de acceso utilizado para las variables
empleadas en el proyecto fue private reduciéndose
así el nivel de visibilidad. Se indicó de esta manera
que las variables sólo son accesibles por los
métodos de la misma clase en la que se declararon.
private JLabel Titulo;
private JTextArea Area;
private JScrollPane Cuadro;
private JButton Crear, Ordenar, Desordenar, QuickSort;
private JButton BubbleSort, ShellSort, Limpiar, Salir;
private JButton Tiempo;
private boolean PEjecutandose = false;
private int[] ArregloOrdenado = new int[0];
private int[] ArregloDesordenado = new int[0];
private int[] ArregloNum = new int[0];
private int Tamaño, Milisegundos = 0;
private int Moda;
private double Media, Mediana;
Las variables Moda, Media y Mediana se utilizaron
en una funcionalidad extra del programa encargada
de obtener el valor que aparece con mayor
frecuencia, el promedio del conjunto de valores del
arreglo y el valor que ocupa el lugar central de todos
los datos.
Haciendo uso del arreglo color y empleando un
código de selección aleatoria dentro del constructor
de la clase OrdenamientoConHilos el programa es
capaz de cambiar de fondo con cada ejecución
añadiéndose de esta manera un efecto visual s
llamativo.
private Color colorBg;
private Color[] color = {
new Color(255, 0, 0),
new Color(36, 0, 255),
new Color(255, 0, 246),
new Color(0, 246, 255),
new Color(48, 255, 0),
new Color(240, 225, 0),
new Color(255, 174, 0),
new Color(0, 186, 255)
};
Random rn = new Random();
colorBg = color[rn.nextInt(color.length)];
getContentPane().setBackground(colorBg);
Ilustración 2 Cambio de fondo
Fuente: Elaborado por el autor
En el constructor se creó un objeto con el nombre
V1 perteneciente a la clase Variables con el fin de
crear métodos que se encarguen del color, la fuente
y el fondo de los botones, el área de texto y la
etiqueta. Además, se asociaron acciones con
addActionListener a cada botón.
public OrdenamientoConHilos() {
Random rn = new Random();
colorBg = color[rn.nextInt(color.length)];
setDefaultCloseOperation(EXIT_ON_CLOSE);
getContentPane().setBackground(colorBg);
Color Negro = new Color(0, 0, 0);
Color Blanco = new Color(255, 255, 255);
Font Fuente = new Font("Arial", 0, 20);
Font Fuente2 = new Font("Arial", 0, 40);
setLayout(null);
setTitle("Método de Ordenamiento");
Variables V1 = new Variables();
V1.Botones(Negro, Blanco, Fuente);
V1.Etiquetas(Negro, Blanco, Fuente2);
V1.Cuadro(Negro, Blanco, Fuente2);
Crear.addActionListener(this);
Desordenar.addActionListener(this);
Ordenar.addActionListener(this);
QuickSort.addActionListener(this);
BubbleSort.addActionListener(this);
ShellSort.addActionListener(this);
Limpiar.addActionListener(this);
Salir.addActionListener(this);
Tiempo.addActionListener(this);
}
Revista Nexos Científicos
Julio-Diciembre 2022 pp. 01-11
Volumen 1, Número 2
Fecha de recepción: agosto 2022
ISSN: 2773-7489
Correo: editor@istvidanueva.edu.ec
URL: http://nexoscientificos.vidanueva.edu.ec/index.php/ojs/index
Fecha de aceptación: octubre 2022
4
La clase Variables es la encargada de la creación de
los botones, etiquetas y el cuadro donde se muestra
todo el proceso de ordenamiento del proyecto. La
clase contiene métodos que reciben el color, la
fuente y fondo de cada uno de los elementos que
conforman la interfaz del programa.
Método Botones:
public void Botones(Color Negro, Color Blanco, Font Fuente) {
Fuente = new Font("Arial Black", 0, 15);
Crear = new JButton("Crear");
Crear.setBounds(10, 80, 142, 30);
Crear.setBackground(Blanco);
Crear.setForeground(Negro);
Crear.setFont(Fuente);
add(Crear);
Método Etiquetas:
public void Etiquetas(Color Negro, Color Blanco, Font Fuente2)
{
Titulo = new JLabel("Método de Ordenamiento");
Titulo.setBounds(170, 0, 550, 80);
Titulo.setBackground(Blanco);
Titulo.setForeground(Negro);
Titulo.setFont(Fuente2);
add(Titulo);
}
Método Cuadro:
public void Cuadro(Color Negro, Color Fondo, Font Fuente) {
Fondo = new Color(0, 70, 255);
Fuente = new Font("Arial Black", 0, 15);
Area = new JTextArea();
Cuadro = new JScrollPane(Area);
Cuadro.setBounds(180, 80, 430, 430);
Area.setLineWrap(true);
Area.setWrapStyleWord(true);
Area.setBackground(Fondo);
Area.setForeground(Negro);
Area.setFont(Fuente);
add(Cuadro);
}
La interfaz ActionListener, solo tiene un método
actionPerformed(ActionEvent) al que se llama
cuando el usuario acaba de realizar una acción. En
este caso este evento se invoca automáticamente
cada vez que se hace clic en alguno de los botones.
Dentro colocamos el objeto O1 de la clase
Ordenamiento, los hilos 1, 2 y 3 y el código de
ejecución de cada uno de los botones del programa
public void actionPerformed(ActionEvent A) {
Ordenamiento O1 = new Ordenamiento();
Hilo1 Hilo1 = new Hilo1();
Hilo2 Hilo2 = new Hilo2();
Hilo3 Hilo3 = new Hilo3();
if (A.getSource() == Crear) {
if (PEjecutandose == false) {
MostrarDesordenado = "";
//Tamaño = (int)(Math.random()*7+3);
Tamaño = 10;
ArregloOrdenado = new int[Tamaño];
ArregloDesordenado = new int[Tamaño];
O1.CrearArreglo(0);
O1.MostrarDesordenado(0);
Area.append("Tamaño: " + Tamaño +
"\nArreglo: " + MostrarDesordenado + "\n");
} else {
JOptionPane.showMessageDialog(null,
"ERROR!!! El hilo aún se ejecuta");
}
}
if (A.getSource() == Desordenar) {
if (PEjecutandose == false) {
Area.append("\nArreglo: " +
MostrarDesordenado + "\n");
} else {
JOptionPane.showMessageDialog(null,
"ERROR!!! El hilo aún se ejecuta");
}
}
if (A.getSource() == Ordenar) {
if (PEjecutandose == false) {
int B = Tamaño;
MostrarOrdenado = "";
O1.Bubble();
O1.MostrarOrdenado(0);
Area.append("\nArreglo ordenado: " +
MostrarOrdenado + "\n");
O1.Estadisitica();
Area.append("\nMedia: " + Media + "\n"
+ "Moda: " + Moda + "\n"
+ "Mediana: " + Mediana + "\n");
} else {
JOptionPane.showMessageDialog(null,
"ERROR!!! El hilo aún se ejecuta");
}
}
if (A.getSource() == QuickSort) {
if (PEjecutandose == false) {
Hilo2.start();
} else {
JOptionPane.showMessageDialog(null,
"ERROR!!! El hilo aún se ejecuta");
}
}
if (A.getSource() == BubbleSort) {
if (PEjecutandose == false) {
Hilo1.start();
} else {