Added quick sort.
This commit is contained in:
@@ -246,4 +246,125 @@ public class Array {
|
||||
|
||||
return cambio;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ordenar el array usando quick.
|
||||
* @param paso boolean: Si es verdad, solo hago en paso del ordenamiento, sino ordenear todos los elementos.
|
||||
* @return boolean: Verdad si algo cambió, sino falso.
|
||||
*/
|
||||
public boolean quick(boolean paso) {
|
||||
String array[] = this.array.clone();
|
||||
boolean cambio = false;
|
||||
boolean cambio2;
|
||||
cambio2 = recurenciaQuick(0, size() - 1, paso);
|
||||
for (int i = 0; i < size(); i++) {
|
||||
if (!array[i].equals(this.array[i])) {
|
||||
cambio = true;
|
||||
}
|
||||
}
|
||||
return (cambio || cambio2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Metodo recursivo para ordenar using quick sort.
|
||||
* @param izquerda int: La posición del quick desded la izquerda.
|
||||
* @param derecha int: La posición del quick desded la derecha..
|
||||
* @param paso boolean: Si es verdad, solo hago en paso del ordenamiento, sino ordenear todos los elementos.
|
||||
* @return boolean: Verdad si algo cambió, sino falso.
|
||||
*/
|
||||
private boolean recurenciaQuick(int izquerda, int derecha, boolean paso) {
|
||||
boolean cambio;
|
||||
boolean cambio2;
|
||||
|
||||
if (derecha - izquerda <= 0) {
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
String pivot = array[derecha];
|
||||
|
||||
ParticionarResult particionarResult = particionar(izquerda, derecha, pivot);
|
||||
if (paso && particionarResult.getCambio()) {
|
||||
return particionarResult.getCambio();
|
||||
}
|
||||
cambio = recurenciaQuick(izquerda, particionarResult.getPunteroIzquerda() - 1, paso);
|
||||
cambio2 = recurenciaQuick(particionarResult.getPunteroIzquerda() + 1, derecha, paso);
|
||||
return (paso && (cambio || cambio2));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param izquerda int: La posición del quick desded la izquerda.
|
||||
* @param derecha int: La posición del quick desded la derecha.
|
||||
* @param pivot String: El valor a comparar con los otros.
|
||||
* @return ParticionarResult: Los resultados de particionar.
|
||||
*/
|
||||
private ParticionarResult particionar(int izquerda, int derecha, String pivot) {
|
||||
boolean cambio = false;
|
||||
|
||||
int punteroIzquerda = izquerda-1;
|
||||
int punteroDerecha = derecha;
|
||||
while (true) {
|
||||
//noinspection StatementWithEmptyBody
|
||||
while (Integer.valueOf(array[++punteroIzquerda]) < Integer.valueOf(pivot));
|
||||
//noinspection StatementWithEmptyBody
|
||||
while (punteroDerecha > 0 && Integer.valueOf(array[--punteroDerecha]) > Integer.valueOf(pivot));
|
||||
|
||||
if (punteroIzquerda >= punteroDerecha) {
|
||||
break;
|
||||
}
|
||||
else {
|
||||
String temp = array[punteroIzquerda];
|
||||
array[punteroIzquerda] = array[punteroDerecha];
|
||||
array[punteroDerecha] = temp;
|
||||
cambio = true;
|
||||
}
|
||||
}
|
||||
String temp = array[punteroIzquerda];
|
||||
array[punteroIzquerda] = array[derecha];
|
||||
array[derecha] = temp;
|
||||
|
||||
return new ParticionarResult(cambio, punteroIzquerda);
|
||||
}
|
||||
|
||||
/**
|
||||
* Esta clase contiene los resultados de Partricionar.
|
||||
*/
|
||||
final public class ParticionarResult {
|
||||
/**
|
||||
* Si habia algun cambio.
|
||||
*/
|
||||
private boolean cambio;
|
||||
|
||||
/**
|
||||
* La parte izquerda que cambió.
|
||||
*/
|
||||
private int punteroIzquerda;
|
||||
|
||||
/**
|
||||
* Inicializar.
|
||||
* @param cambio boolean: Si habia un cambio o no.
|
||||
* @param punteroIzquerda: El valor desde la izquerda donde fue un cambio.
|
||||
*/
|
||||
public ParticionarResult(boolean cambio, int punteroIzquerda) {
|
||||
this.cambio = cambio;
|
||||
this.punteroIzquerda = punteroIzquerda;
|
||||
}
|
||||
|
||||
/**
|
||||
* Devolver el cambio.
|
||||
* @return boolean: Devolver el valor de cambio.
|
||||
*/
|
||||
public boolean getCambio() {
|
||||
return cambio;
|
||||
}
|
||||
|
||||
/**
|
||||
* Devolver el puntero izquerda.
|
||||
* @return int: Devolver el valor de puntero.
|
||||
*/
|
||||
public int getPunteroIzquerda() {
|
||||
return punteroIzquerda;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -118,6 +118,18 @@ public class MenuController extends VBox implements Initializable {
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Click en Selecion.
|
||||
*/
|
||||
@FXML
|
||||
protected void menuQuick() {
|
||||
loadStage(
|
||||
resourceBundle.getString("tituloQuick"),
|
||||
"/cl/cromer/estructuras/fxml/quick.fxml",
|
||||
"/cl/cromer/estructuras/css/style.css"
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Click en Pila.
|
||||
*/
|
||||
@@ -240,6 +252,7 @@ public class MenuController extends VBox implements Initializable {
|
||||
* Cargar el fxml y css.
|
||||
* @param fxml String: El archivo de fxml.
|
||||
* @param css String: El archivo de css.
|
||||
* @param resourceBundle ResourceBundle: El idioma nuevo para cambiarlo.
|
||||
*/
|
||||
private void loadStage(String fxml, String css, ResourceBundle resourceBundle) {
|
||||
Scene scene = menuBar.getScene();
|
||||
@@ -265,6 +278,7 @@ public class MenuController extends VBox implements Initializable {
|
||||
* @param title String: El titulo de la escena.
|
||||
* @param fxml String: El archivo de fxml.
|
||||
* @param css String: El archivo de css.
|
||||
* @param object Object: El objeto a pasar a la nueva escena.
|
||||
*/
|
||||
private void loadStage(String title, String fxml, String css, Object object) {
|
||||
Scene scene = menuBar.getScene();
|
||||
|
174
src/cl/cromer/estructuras/QuickController.java
Normal file
174
src/cl/cromer/estructuras/QuickController.java
Normal file
@@ -0,0 +1,174 @@
|
||||
package cl.cromer.estructuras;
|
||||
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.fxml.Initializable;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.control.ButtonBar;
|
||||
import javafx.scene.control.ButtonType;
|
||||
import javafx.scene.control.Dialog;
|
||||
import javafx.scene.layout.HBox;
|
||||
import javafx.scene.text.Text;
|
||||
|
||||
import java.net.URL;
|
||||
import java.util.Random;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.Scanner;
|
||||
|
||||
/**
|
||||
* Esta clase es para controlar todos la interfaz de Quick.
|
||||
* @author Chris Cromer
|
||||
*/
|
||||
public class QuickController implements Initializable {
|
||||
/**
|
||||
* Donde poner el contenido de array.
|
||||
*/
|
||||
@FXML private HBox contenidoQuick;
|
||||
|
||||
/**
|
||||
* Donde va el codigo a mostrar a la pantalla.
|
||||
*/
|
||||
@FXML private Text codigoQuick;
|
||||
|
||||
/**
|
||||
* La escena donde está cosas graficas.
|
||||
*/
|
||||
private Scene scene;
|
||||
|
||||
/**
|
||||
* Donde está guardado los idiomas.
|
||||
*/
|
||||
private ResourceBundle resourceBundle;
|
||||
|
||||
/**
|
||||
* El array usado en la aplicación.
|
||||
*/
|
||||
private Array array;
|
||||
|
||||
/**
|
||||
* Inicializar todos los datos y dibujar las graficas.
|
||||
* @param location URL: El URL de fxml en uso.
|
||||
* @param resourceBundle ResourceBundle: Tiene datos de idioma.
|
||||
*/
|
||||
@Override
|
||||
public void initialize(URL location, ResourceBundle resourceBundle) {
|
||||
this.resourceBundle = resourceBundle;
|
||||
|
||||
scene = null;
|
||||
|
||||
Colores colores = new Colores();
|
||||
|
||||
Random random = new Random();
|
||||
int maximo = 99;
|
||||
int minimo = 0;
|
||||
int rango = maximo - minimo + 1;
|
||||
|
||||
array = new Array(10);
|
||||
array.setOrdered(true);
|
||||
|
||||
for (int i = 0; i < 10; i++) {
|
||||
int numero = random.nextInt(rango) + minimo;
|
||||
while (array.buscar(numero) != -1) {
|
||||
numero = random.nextInt(rango) + minimo;
|
||||
}
|
||||
array.insertar(numero);
|
||||
contenidoQuick.getChildren().addAll(Grafico.crearCaja(colores, String.valueOf(i), String.valueOf(numero)));
|
||||
colores.siguinteColor();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Crear un array nuevo.
|
||||
*/
|
||||
@FXML
|
||||
protected void botonNuevo() {
|
||||
if (scene == null) {
|
||||
initializeScene();
|
||||
}
|
||||
|
||||
array = new Array(10);
|
||||
array.setOrdered(true);
|
||||
|
||||
Random random = new Random();
|
||||
int maximo = 99;
|
||||
int minimo = 0;
|
||||
int rango = maximo - minimo + 1;
|
||||
|
||||
for (int i = array.size(); i < 10; i++) {
|
||||
int numero = random.nextInt(rango) + minimo;
|
||||
while (array.buscar(numero) != -1) {
|
||||
numero = random.nextInt(rango) + minimo;
|
||||
}
|
||||
array.insertar(numero);
|
||||
}
|
||||
generarGrafico();
|
||||
}
|
||||
|
||||
/**
|
||||
* Ordenarlo paso por paso.
|
||||
*/
|
||||
@FXML
|
||||
protected void botonPaso() {
|
||||
if (scene == null) {
|
||||
initializeScene();
|
||||
}
|
||||
|
||||
// Mostrar el codigo
|
||||
String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/quick/ordenar")).useDelimiter("\\Z").next();
|
||||
codigoQuick.setText(codigoTexto);
|
||||
|
||||
if (!array.quick(true)) {
|
||||
errorYaOrdenado();
|
||||
}
|
||||
|
||||
generarGrafico();
|
||||
}
|
||||
|
||||
/**
|
||||
* Ordenarlo completamente.
|
||||
*/
|
||||
@FXML
|
||||
protected void botonCorrer() {
|
||||
if (scene == null) {
|
||||
initializeScene();
|
||||
}
|
||||
|
||||
// Mostrar el codigo
|
||||
String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/quick/ordenar")).useDelimiter("\\Z").next();
|
||||
codigoQuick.setText(codigoTexto);
|
||||
|
||||
if (!array.quick(false)) {
|
||||
errorYaOrdenado();
|
||||
}
|
||||
|
||||
generarGrafico();
|
||||
}
|
||||
|
||||
/**
|
||||
* Se muestra un error si el array ya está ordenado.
|
||||
*/
|
||||
private void errorYaOrdenado() {
|
||||
ButtonType botonCerrar = new ButtonType(resourceBundle.getString("cerrar"), ButtonBar.ButtonData.OK_DONE);
|
||||
Dialog<String> dialog = new Dialog<>();
|
||||
dialog.setTitle(resourceBundle.getString("error"));
|
||||
dialog.setContentText(resourceBundle.getString("quickYaOrdenado"));
|
||||
dialog.getDialogPane().getButtonTypes().add(botonCerrar);
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
/**
|
||||
* Crear el array de temaño 10.
|
||||
*/
|
||||
private void initializeScene() {
|
||||
scene = contenidoQuick.getScene();
|
||||
}
|
||||
|
||||
/**
|
||||
* Poner los valores en el grafico.
|
||||
*/
|
||||
private void generarGrafico() {
|
||||
for (int i = 0; i < 10; i++) {
|
||||
Text text = (Text) scene.lookup("#caja_" + String.valueOf(i));
|
||||
text.setText(array.getIndice(i));
|
||||
}
|
||||
}
|
||||
}
|
@@ -7,6 +7,7 @@ tituloBurbuja=Bubble
|
||||
tituloInsercion=Insertion
|
||||
tituloSeleccion=Selection
|
||||
tituloShell=Shell
|
||||
tituloQuick=Quick
|
||||
|
||||
estructuras=Structures
|
||||
array=Array
|
||||
@@ -17,6 +18,7 @@ burbuja=Bubble
|
||||
insercion=Insertion
|
||||
seleccion=Selection
|
||||
shell=Shell
|
||||
quick=Quick
|
||||
listaEnlazada=Linked List
|
||||
listaSimple=Simple
|
||||
listaCircular=Circular
|
||||
@@ -77,6 +79,8 @@ seleccionYaOrdenado=The array is already sorted.
|
||||
|
||||
shellYaOrdenado=The array is already sorted.
|
||||
|
||||
quickYaOrdenado=The array is already sorted.
|
||||
|
||||
pilaLlena=Value not inserted because the stack is full.
|
||||
pilaVacia=The stack is empty.
|
||||
pilaNoValor=Please input a numeric value.
|
||||
|
@@ -7,6 +7,7 @@ tituloBurbuja=Burbuja
|
||||
tituloInsercion=Inserci\u00F3n
|
||||
tituloSeleccion=Selecci\u00F3n
|
||||
tituloShell=Shell
|
||||
tituloQuick=Quick
|
||||
|
||||
estructuras=Estructuras
|
||||
array=Array
|
||||
@@ -17,6 +18,7 @@ burbuja=Burbuja
|
||||
insercion=Inserci\u00F3n
|
||||
seleccion=Seleci\u00F3n
|
||||
shell=Shell
|
||||
quick=Quick
|
||||
listaEnlazada=Lista Enlazada
|
||||
listaSimple=Simple
|
||||
listaCircular=Circular
|
||||
@@ -77,6 +79,8 @@ seleccionYaOrdenado=El array ya est\u00E1 ordenado.
|
||||
|
||||
shellYaOrdenado=El array ya est\u00E1 ordenado.
|
||||
|
||||
quickYaOrdenado=El array ya est\u00E1 ordenado.
|
||||
|
||||
pilaLlena=Valor no fue insertado porque la pila est\u00E1 llena.
|
||||
pilaVacia=La pila est\u00E1 vac\u00EDa.
|
||||
pilaNoValor=Ingresar un valor num\u00E9rico por favor.
|
||||
|
47
src/cl/cromer/estructuras/code/quick/ordenar
Normal file
47
src/cl/cromer/estructuras/code/quick/ordenar
Normal file
@@ -0,0 +1,47 @@
|
||||
public void quick() {
|
||||
// Llamar al metodo recursivo.
|
||||
recurenciaQuick(0, elementos - 1);
|
||||
}
|
||||
|
||||
private void recurenciaQuick(int izquerda, int derecha) {
|
||||
if (derecha - izquerda <= 0) {
|
||||
// Si derecha es menor que izquerda ya terminó.
|
||||
return;
|
||||
}
|
||||
else {
|
||||
int pivot = array[derecha];
|
||||
|
||||
int particion = particionar(izquerda, derecha, pivot);
|
||||
recurenciaQuick(izquerda, particion - 1);
|
||||
recurenciaQuick(particion + 1, derecha);
|
||||
}
|
||||
}
|
||||
|
||||
private int particionar(int izquerda, int derecha, int pivot) {
|
||||
int punteroIzquerda = izquerda-1;
|
||||
int punteroDerecha = derecha;
|
||||
while (true) {
|
||||
// Sumar el punteroIzquerda hasta que es igual al pivot
|
||||
while (array[++punteroIzquerda] < pivot);
|
||||
// Restar el puntoDerecha hasta que es igual a pivot o hasta 0.
|
||||
while (punteroDerecha > 0 && array[--punteroDerecha] > pivot);
|
||||
|
||||
if (punteroIzquerda >= punteroDerecha) {
|
||||
// Si el puntero izquerda es mayor o igual a la derech termina el while.
|
||||
break;
|
||||
}
|
||||
else {
|
||||
// Intercambiar los valores.
|
||||
int temp = array[punteroIzquerda];
|
||||
array[punteroIzquerda] = array[punteroDerecha];
|
||||
array[punteroDerecha] = temp;
|
||||
}
|
||||
}
|
||||
// Intercambiar los valores.
|
||||
int temp = array[punteroIzquerda];
|
||||
array[punteroIzquerda] = array[derecha];
|
||||
array[derecha] = temp;
|
||||
|
||||
// Devolver la posición donde terminó.
|
||||
return punteroIzquerda;
|
||||
}
|
@@ -13,6 +13,7 @@
|
||||
<MenuItem text="%insercion" onAction="#menuInsercion"/>
|
||||
<MenuItem text="%seleccion" onAction="#menuSeleccion"/>
|
||||
<MenuItem text="%shell" onAction="#menuShell"/>
|
||||
<MenuItem text="%quick" onAction="#menuQuick"/>
|
||||
</Menu>
|
||||
<Menu text="%listaEnlazada">
|
||||
<MenuItem text="%listaSimple"/>
|
||||
|
24
src/cl/cromer/estructuras/fxml/quick.fxml
Normal file
24
src/cl/cromer/estructuras/fxml/quick.fxml
Normal file
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.scene.control.*?>
|
||||
<?import javafx.scene.layout.*?>
|
||||
<?import javafx.scene.text.Text?>
|
||||
|
||||
<VBox xmlns:fx="http://javafx.com/fxml/1" prefHeight="768.0" prefWidth="1024.0" spacing="10" xmlns="http://javafx.com/javafx/8.0.92" fx:controller="cl.cromer.estructuras.QuickController">
|
||||
<fx:include source="menu.fxml" />
|
||||
<ScrollPane fitToHeight="true" fitToWidth="true" VBox.vgrow="ALWAYS">
|
||||
<HBox alignment="TOP_CENTER" VBox.vgrow="ALWAYS" spacing="50">
|
||||
<VBox spacing="10">
|
||||
<HBox alignment="CENTER" spacing="10">
|
||||
<Button text="%nuevo" onAction="#botonNuevo" />
|
||||
<Button text="%paso" onAction="#botonPaso" />
|
||||
<Button text="%correr" onAction="#botonCorrer" />
|
||||
</HBox>
|
||||
<HBox fx:id="contenidoQuick" alignment="CENTER" />
|
||||
</VBox>
|
||||
<StackPane alignment="TOP_LEFT" minWidth="450">
|
||||
<Text fx:id="codigoQuick" />
|
||||
</StackPane>
|
||||
</HBox>
|
||||
</ScrollPane>
|
||||
</VBox>
|
Reference in New Issue
Block a user