Você está na página 1de 5

UNIVERSIDAD NACIONAL DE TRUJILLO

FACULTAD DE INGENIERÍA
ESCUELA ACADEMICA PROFESIONAL DE INGENIERÍA DE SISTEMAS

ESTRUCTURA DE DATOS ORIENTADA A


OBJETOS
ALUMNOS:
-Malca Cerna Saul Hilario
-Melgarejo Adrianzén Anthony Eduardo
-Montenegro Hurtado William Rodrigo
-Saldaña Amaya Jeanpool Fabricio
-Vásquez Pérez Isaías Fernando Raúl
-Arribasplata Revilla Alexs Jhon

GUADALUPE - 2022
ALGORITMO DE ORDENAMIENTO GNOME SORT

El algoritmo de ordenación conocido como gnome sort tiene una historia de invención cuasi
paralela. Durante un tiempo existió la polémica sobre su invención, finalmente atribuida a Hamid
Sarbazi-Azad quien lo desarrolló en el año 2000 y al que llamó Stupid sort (Ordenamiento
estúpido).

Cuando Dick Grune lo reinventó y documentó, no halló evidencias de que existiera y en palabras
suyas, dijo de él "the simplest sort algorithm" (El algoritmo más simple) y quizás tenga razón,
pues lo describió en sólo cuatro líneas de código. Dick Grune se basó en los gnomos de jardín
holandés y la manera en que se colocan dentro de los maceteros y de ahí también el nombre que
le dio.

Netamente es un algoritmo de burbuja con una clara particularidad: recorre el array a ordenar
como una cremallera, en un vaivén, o bien puede ser definido como un ordenamiento de burbuja
bidireccional.

El algoritmo empieza comparando la primera pareja de valores. Si están en orden incrementa el


puntero y vuelve a realizar la comparación: si no están en orden, se pasa el menor a la izquierda
y el mayor a la derecha, y se reduce el puntero. Ahora la comparación es con el elemento
anterior, y si no hay un elemento anterior se pasa al siguiente elemento. Cuando el puntero
alcanza el extremo superior del array, ya está totalmente ordenado.

DESARROLLO EN VISUAL STUDIO C++

Formulario principal
Elementos del formulario

OBJETO PROPIEDAD VALOR


GroupBox1 Text Registro de datos
Label1 Text Ingresar número
TextBox1 Name txtNumero
Name btnRegistrar
Button1
Text Registrar
ListBox1 Name lstRegistros
GroupBox2 Text Operaciones
Name btnAscendente
Button2
Text Ordenar ascendentemente
Name btnDescendente
Button3
Text Ordenar descendentemente
ListBox2 Name lstOrdenado

SCRIPT DE LA CLASE METODOS

Metodos.h
#pragma once
class Metodos
{
public:
double numero;
double vDatos[50];
int pos;
public:
Metodos();
~Metodos();

void setNumero(double);
void setPos(int);
void setDatos(double, int);

long getNumero();
int getPos();
long getDatos();

void gnomeSortAsc(double[], int, int);


void gnomeSortDesc(double[], int, int);
void copyVector(double[], double[], int);
};

Metodos.cpp
#include "Metodos.h"
Metodos::Metodos() {
pos = -1;
for (int i = 0; i < 50; i++) {
vDatos[i] = 0;
}
}
Metodos::~Metodos() {
}

void Metodos::setNumero(double numero) {


this->numero = numero;
}

void Metodos::setPos(int pos) {


this->pos = pos;
}

void Metodos::setDatos(double numero, int pos) {


this->vDatos[pos] = numero;
}

long Metodos::getNumero() {
return numero;
}

int Metodos::getPos() {
return pos;
}

long Metodos::getDatos() {
return vDatos[pos];
}

void Metodos::gnomeSortAsc(double v[], int pos, int n) {


if (pos <= n) {
if (pos == 0 || v[pos] >= v[pos - 1]) {
gnomeSortAsc(v, pos + 1, n);
}
else {
double temp = v[pos - 1];
v[pos - 1] = v[pos];
v[pos] = temp;
gnomeSortAsc(v, pos - 1, n);
}
}
}

void Metodos::gnomeSortDesc(double v[], int pos, int n) {


if (pos <= n) {
if (pos == 0 || v[pos] <= v[pos - 1]) {
gnomeSortDesc(v, pos + 1, n);
}
else {
double temp = v[pos - 1];
v[pos - 1] = v[pos];
v[pos] = temp;
gnomeSortDesc(v, pos - 1, n);
}
}
}

void Metodos::copyVector(double vAntiguo[], double vNuevo[], int pos) {


if (pos >= 0) {
vNuevo[pos] = vAntiguo[pos];
copyVector(vAntiguo, vNuevo, pos - 1);
}
}
PROGRAMACIÓN DE BOTONES DEL MENÚ

private: System::Void btnRegistrar_Click(System::Object^ sender,


System::EventArgs^ e) {
if (txtNumero->Text != "") {
MT->setNumero(Convert::ToDouble(txtNumero->Text));
int pos = MT->getPos();
MT->setPos(pos += 1);
MT->setDatos(MT->getNumero(), MT->getPos());
lstRegistros->Items->Add(MT->getNumero());
txtNumero->Text = "";
txtNumero->Focus();
}
else {
MessageBox::Show("Debe ingresar un número válido");
txtNumero->Focus();
}
}

private: System::Void btnAscendente_Click(System::Object^ sender,


System::EventArgs^ e) {
lstOrdenado->Items->Clear();
MT->gnomeSortAsc(MT->vDatos, 0, MT->pos);
double vAux[50];
MT->copyVector(MT->vDatos, vAux, MT->pos);
for (int i = 0; i <= MT->pos; i++) {
lstOrdenado->Items->Add(Convert::ToString(vAux[i]));
}
}

private: System::Void btnDescendente_Click(System::Object^ sender,


System::EventArgs^ e) {
lstOrdenado->Items->Clear();
MT->gnomeSortDesc(MT->vDatos, 0, MT->pos);
double vAux[50];
MT->copyVector(MT->vDatos, vAux, MT->pos);
for (int i = 0; i <= MT->pos; i++) {
lstOrdenado->Items->Add(Convert::ToString(vAux[i]));
}
}

LINK DEL PROYECTO DESARROLLADO:


https://drive.google.com/file/d/1yDqKpTwwuMInwrE4dgr1-LzIdGk-
xgpd/view?usp=share_link

Você também pode gostar