Existen múltiples algoritmos de ordenamiento que permiten ordenar una secuencia de items de alguna forma en la cual, nuestra lógica este enfocada. Si bien, en muchos lenguajes de programación, existen múltiples utilidades y métodos que vienen por defecto que nos permiten ordenar elementos de un mismo tipo, sin ningún problema.
Sin embargo, esto no es posible de forma sencilla con elementos que son objetos, o que son tipos de datos distintos. Depende de la estructuración que se genere, poder crear un algoritmo que nos permita ordenar estos elementos de acuerdo, a ciertas condiciones.
Tabla de Complejidad para los Algoritmos de Ordenamiento Básicos
Para el uso de múltiples algoritmos de ordenamiento, se crearan datos dummies, que nos faciliten el trabajo y la agilidad a la hora de trabajar, del mismo modo, nos permitirá hacer uso de conceptos importantes en el manejo de Clases y Funciones Built-In de Python.
Trabajaremos con datos de personas: nombre, apellido, altura, peso y la edad, esta última será nuestro dato de referencia principal para ordenar los datos.
Se definen, los nombres y apellidos a combinar en un archivo data.py
:
names = ["Diego", "Carlos", "Juan", "Luis", "Jose", "Francisco", "Alberto", "Mario", "Fernando", "Eduardo",
"Gabriel", "David", "Daniel", "Jorge", "Sergio", "Rodrigo", "Mario", "Andres", "Enrique", "Rafael",
"Marcos", "Alex", "Samuel", "Roberto", "Ruben", "Angel", "Victor", "Maximiliano", "Ivan", "Sergio",
"Fabian", "Jorge", "Santiago", "Rodrigo", "Adrian", "Raul", "Cesar", "Lucas", "Marcos", "Miguel",
"Jose", "Eduardo", "Jorge", "Oscar", "Antonio", "Eduardo", "Alejandro", "Carlos", "Juan", "Enrique",
"Luis", "Jose", "Francisco", "Alberto", "Mario", "Fernando", "Eduardo", "Gabriel", "David", "Daniel",
"Jorge", "Sergio", "Rodrigo", "Mario", "Andres", "Enrique", "Rafael", "Marcos", "Alex", "Samuel",
"Roberto", "Ruben", "Angel", "Victor", "Maximiliano", "Ivan", "Sergio", "Fabian", "Jorge", "Santiago",
"Rodrigo", "Adrian", "Raul", "Cesar", "Lucas", "Marcos", "Miguel"]
surnames = ["Garcia", "Martinez", "Rodriguez", "Lopez", "Perez", "Gonzalez", "Sanchez", "Ramirez", "Torres", "Gomez",
"Diaz", "Cruz", "Hernandez", "Mendez", "Alvarez", "Jimenez", "Moreno", "Aguilar", "Medina", "Muñoz",
"Rojas", "Vargas", "Castro", "Castillo", "Suarez", "Ortiz", "Rubio", "Molina", "Delgado", "Sosa",
"Herrera", "Fernandez", "Blanco", "Alfaro", "Estrada", "Aguirre", "Carrasco", "Vasquez", "Rios", "Cabrera",
"Cortez", "Chavez", "Flores", "Espinoza", "Fuentes", "Cano", "Avila", "Nunez", "Bravo", "Jacquez",
"Juarez", "Gallegos", "Guerrero", "Peralta", "Silva", "Benitez", "Carrillo", "Montes", "Acosta", "Navarro",
"Santos", "Guzman", "Calderon", "Lara", "Rivas", "Cardenas", "Leiva", "Sandoval", "Guerra", "Valdez",
"Carrasquel", "Mejia", "Zambrano", "Castañeda", "Espinosa", "Garcia", "Rangel", "Garcia", "Ruelas"]
Ahora que tenemos los datos de nombres y apellidos, debemos crear nuestro objeto Persona, la cual contendrá todos los datos anteriormente mencionados. Sin embargo, debemos definir funciones que se encarguen de crear el nombre y demás datos.
En un archivo, generator.py
, crearemos toda esta generación de objetos Persona.
from data import *
def giveName():
name = random.choice(names)
surname1 = random.choice(surnames)
surname2 = random.choice(surnames)
return f'{name} {surname1} {surname2}'
Con esta función, creamos de forma aleatoria los nombres de nuestros objetos, importando los datos anteriormente almacenados en data.py
.
Ahora debemos crear el objeto Persona como tal:
from data import *
import random
class Person():
def __init__(self):
self.name = giveName()
self.height = round(random.uniform(1.30, 2.10), 3)
self.weight = round(random.uniform(40.0, 180.0), 3)
self.age = round(random.uniform(18, 90), 0)
def __str__(self):
return f'Persona:[{self.name}|{self.height} m|{self.weight} kg|{self.age} years old]'
def giveName():
name = random.choice(names)
surname1 = random.choice(surnames)
surname2 = random.choice(surnames)
return f'{name} {surname1} {surname2}'
Se inicializa el objeto, con el nombre aleatorio creado por la función giveName()
, para la altura, el peso y la edad se utilizan valores aleatorios entre sus 2 limites respectivos. Finalmente, re-definimos la función built-in __str__
para imprimir los datos de una mejor forma.
Posteriormente, para completar esta definición del objeto, necesitamos modificar las funciones que se encargan de realizar las comparaciones con los operadores <
,>
y ==
. Estas también son funciones built-in, que pueden ser redefinidas para un objeto en particular, y lo realizamos de la siguiente forma:
from data import *
import random
class Person():
def __init__(self):
self.name = giveName()
self.height = round(random.uniform(1.30, 2.10), 3)
self.weight = round(random.uniform(40.0, 180.0), 3)
self.age = round(random.uniform(18, 90), 0)
def __str__(self):
return f'Persona:[{self.name}|{self.height} m|{self.weight} kg|{self.age} years old]'
def __gt__(self, nextPerson):
return self.age > nextPerson.age
def __lt__(self, nextPerson):
return self.age < nextPerson.age
def __eq__(self, nextPerson):
return self.age == nextPerson.age
def giveName():
name = random.choice(names)
surname1 = random.choice(surnames)
surname2 = random.choice(surnames)
return f'{name} {surname1} {surname2}'
Para __gt__
(greater than), __lt__
(lower than) y __eq__
(equal), se re-definió su comparación, en cada caso, se analiza la edad del objeto como se es necesario. Así se puede realizar una sobrecarga de operadores en Python.