CLR: .Net / Mono / Boo / Otros CLR > C#
Quicksort C#
(1/1)
Schakal:
:hola: hola amigos quisiera saber si alguien me puede ayudar, soy nuevo en lo que es programacion y me gustaria ver un ejemplo de quicksort en c# solo quiero ver algo simple, un ejemplo en el que se ordenden 5 numeros de mayor a menor, el problema esque no se como codificar correctamente el algoritmo, espero que me puedan ayudar. GRACIAS :ph34r:
What_s_up:
Espero que este ejemplo te sirva de ayuda :
Saludos ... ;)
--- Código: Text --- //////////////////////////////////////////////////////////////////////////////// Administración de una Lista de Alumnos// ======================================// Ejemplo de uso de 2 algoritmos de búsqueda y 2 de ordenamiento, incluyendo QuickSort////////////////////////////////////////////////////////////////////////////////using System; namespace OrdyBusqueda1{ class Alumno { string nombre; float nota; public Alumno(string v1, float v2) { nombre = v1; nota = v2; } public float Nota { get { return (nota); } } public string Nombre { get { return (nombre); } } // Se reemplaza el método ToString para luego usar directamente el objecto Alumno en un WriteLine. public override string ToString() { return (nombre + ": " + nota.ToString()); } } class ListaAlumnos { Alumno[] lista; public ListaAlumnos(int cantidad) { // Listas de nombres y aplellidos para armar los nombres aleatoriamente string[] nombres = { "Juan", "Pedro", "Jorge", "Oscar", "Manuel", "Humberto", "Cecilia", "Andrea", "Alejandra", "Paula" }; string[] apellidos = { "Pérez", "Soto", "González", "Ahumada", "Muñoz", "Cáceres", "Araneda" }; Random rn = new Random(DateTime.Now.Millisecond); lista = new Alumno[cantidad]; // Se dimensiona de acuerdo a la cantidad indicada for (int i = 0; i < cantidad; i++) { // Se crea un nuevo alumno generándole un nombre completo aleatorio y una nota también aleatoria string nomcompleto = nombres[rn.Next(0, nombres.Length)] + " " + apellidos[rn.Next(0, apellidos.Length)]; lista[i] = new Alumno(nomcompleto, (float)rn.Next(10, 71) / 10); } } ////////////////////////////////////////////////////////////////////////////////// // ALGORITMO: Ordenamiento Recursivo por Selección (ordenado por nota) public void OrdenarRecursivo(int cantidad) { if (cantidad <= 1) return; int mayor = 0; // Busca el mayor de todos for (int i = 1; i < cantidad; i++) if (lista[i].Nota > lista[mayor].Nota) mayor = i; if (mayor < cantidad - 1) { Alumno aux = lista[cantidad - 1]; lista[cantidad - 1] = lista[mayor]; lista[mayor] = aux; } OrdenarRecursivo(cantidad - 1); } ////////////////////////////////////////////////////////////////////////////////// // ALGORITMO: Ordenamiento Recursivo QuickSort, que utiliza método auxiliar: Particionar() int Particionar(int desde, int hasta) { int izq = desde-1; // Se comienza de uno menos, para asegurar el do-while() int der = hasta+1; // Idem Alumno pivote = lista[(desde + hasta) / 2]; Console.WriteLine("Particionando: {0} {1}", desde, hasta); while (izq < der) { do izq++; while (pivote.Nota > lista[izq].Nota); do der--; while (pivote.Nota < lista[der].Nota); if (izq < der) { Alumno aux = lista[der]; lista[der] = lista[izq]; lista[izq] = aux; } Console.WriteLine(".{0}/{1}.{2} y {3},{4}", izq, der, pivote.Nota, lista[izq].Nota, lista[der].Nota); } Console.WriteLine("."); return (der); } void QuickSort(int desde, int hasta) { if (desde < hasta) { int p = Particionar(desde, hasta); QuickSort(desde, p); QuickSort(p + 1, hasta); } } ////////////////////////////////////////////////////////////////////////////////// // ALGORITMO: Búsqueda Lineal Recursiva int BuscarRec(string nombre, int cantidad) { if (cantidad == 0) return (-1); if (lista[cantidad - 1].Nombre == nombre) return (cantidad - 1); else return (BuscarRec(nombre, cantidad - 1)); } ////////////////////////////////////////////////////////////////////////////////// // ALGORITMO: Búsqueda Binaria Recursiva - asume que la lista está ordenada alfabéticamente int BuscarBin(string nombre, int desde, int hasta) { if (desde > hasta) return (-1); int pm = (desde + hasta) / 2; if (lista[pm].Nombre == nombre) return (pm); if (lista[pm].Nombre.CompareTo(nombre) < 0) return (BuscarBin(nombre, pm + 1, hasta)); else return (BuscarBin(nombre, desde, pm - 1)); } ////////////////////////////////////////////////////////////////////////////////// // ALGORITMO: Búsqueda Binaria Recursiva - asume que la lista está ordenada por nota int BuscarBin(float nota, int desde, int hasta) { if (desde > hasta) return (-1); int pm = (desde + hasta) / 2; if (lista[pm].Nota == nota) return (pm); if (lista[pm].Nota < nota) return (BuscarBin(nota, pm + 1, hasta)); else return (BuscarBin(nota, desde, pm - 1)); } // Métodos genéricos de Búsqueda y Ordenamiento: PUBLICOS // En ellos se puede reemplazar por el algoritmo que se seleccione public int Buscar(string nombre) { return (BuscarBin(nombre, 0, lista.Length - 1)); } public int Buscar(float nota) { return (BuscarBin(nota, 0, lista.Length - 1)); } public void Ordenar() { QuickSort(0, lista.Length - 1); } public void Mostrar() { for (int i = 0; i < lista.Length; i++) Console.WriteLine(lista[i]); } } class MainApp { static void Main() { ListaAlumnos l = new ListaAlumnos(30); l.Mostrar(); Console.WriteLine("--------------------"); l.Ordenar(); l.Mostrar(); // Se implementa búsqueda por nota, ya que la lista está ordenada por nota Console.Write("Ingrese nota a buscar: "); float nota = float.Parse(Console.ReadLine()); int pos = l.Buscar(nota); if (pos >= 0) Console.WriteLine("LO ENCONTRE"); else Console.WriteLine("NO"); Console.ReadLine(); } } }
kota:
--- Cita de: "Schakal" --- :hola: hola amigos quisiera saber si alguien me puede ayudar, soy nuevo en lo que es programacion y me gustaria ver un ejemplo de quicksort en c# solo quiero ver algo simple, un ejemplo en el que se ordenden 5 numeros de mayor a menor, el problema esque no se como codificar correctamente el algoritmo, espero que me puedan ayudar. GRACIAS :ph34r:
--- Fin de la cita ---
te puedo ayudar pero yo programo en visual basic 6, ahy tu diras si te puedo ayudar
JuanK:
Este post es de ahce mas de dos años, no vale la pena revivirlo.
Navegación
Ir a la versión completa