Shell Sort

Esta forma de ordenación es muy parecida a la ordenación con burbuja. La diferencia es que usando el metodo de burbuja se realiza una comparación lineal, y shellsort trabaja con una segmentación entre los datos, acomodandolos en un arreglo unidimensional y subsecuentemente ordenando las columnas. Por lo tanto es un buen método, pero no el mejor para implementarlo en grandes arreglos.

Este proceso se repite cada vez con un arreglo menor, es decir, con menos columnas, en la ultima repeticion solo tiene una columna, cada que se realiza el proceso se ordena mas los datos, hasta que en su ultima repeticion estan completamente ordenados. Sin embargo el numero de operaciones para ordenar en cada repeticion esta limitado debido al preordenamiento que se obtuvo en las repeticiones anteriores.

Algoritmo


void ShellSort(Lista)Lista es un vector que contiene los elementos a ser ordenados. - Declarar variables enteras: i, j, incremento = 3, temp - Repetir mientras incremento > 0: - Repetir mientras i sea menor al tamaño de la Lista - j = i, temp = Lista[i] - Repetir mientras j >= incremento y Lista[j - incremento] > temp - Lista[j] = Lista[j - incremento], j = j - incremento - [fin de ciclo del paso 5] - Lista[j] = temp - [fin de ciclo del paso 3] - si incremento/2 != 0 entonces: - incremento = incremento/2 - si incremento == 1 entonces: - incremento = 0 - si no, entonces: - incremento = 1 - [fin de ciclo del paso 2] - Salir —- Forma principal del programa: Codigo: <code> using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace ShellSort { public partial class Form1 : Form { public static int[] Lista = new int[10]; public static int N = 0; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 Recorrer = new Form2(); } private void button2_Click(object sender, EventArgs e) { Form3 Insercion = new Form3(); } private void button3_Click(object sender, EventArgs e) { Form5 Eliminacion = new Form5(); } private void button4_Click(object sender, EventArgs e) { Form4 Busqueda = new Form4(); } private void button5_Click(object sender, EventArgs e) { if (N != 0) { ShellSort(); MessageBox.Show(“La lista ha sido ordenada”, “Exito”, MessageBoxButtons.OK); } else MessageBox.Show(“Lista vacia…”, “Error”, MessageBoxButtons.OK); } public static void ShellSort() { int i, j, incremento = 3, temp; while (incremento > 0) { for (i = 0; i < N; i++) { j = i; temp = Lista[i]; while 1) { Lista[j] = Lista[j - incremento]; j = j - incremento; } Lista[j] = temp; } if (incremento / 2 != 0) incremento = incremento / 2; else if (incremento == 1) incremento = 0; else incremento = 1; } } private void button6_Click(object sender, EventArgs e) { Application.Exit(); } } } </code> Recorrido: Codigo: <code> using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace ShellSort { public partial class Form2 : Form { public Form2() { InitializeComponent(); Recorrido(); } private void Recorrido() { if (Form1.N != 0) { this.Show(); listBox1.Items.Clear(); for (int i = 0; i < Form1.N; i++) listBox1.Items.Add(Form1.Lista[i]); } else { MessageBox.Show(“Lista vacia…”, “Error”, MessageBoxButtons.OK); this.Close(); } } private void button1_Click(object sender, EventArgs e) { this.Close(); } private void button2_Click(object sender, EventArgs e) { Recorrido(); } } } </code>

1) j >= incremento) && (Lista[j - incremento] > temp
Politica de Privacidad