You are on page 1of 11

Métodos de Ordenamiento

Pedro Guevara Salgado Luís Olascoaga

Universidad de Córdoba Facultad de Ciencias Básicas e Ingenierías Departamento de Ingeniería de Sistemas y Telecomunicaciones

El proceso empieza entonces comparando los elementos de la posiciones 1 y 2 del vector. Es decir. selección. Si el elemento de la posición de la izquierda es mayor que el elemento de la posición que le sigue a su derecha.Métodos de Ordenamiento Muchas veces es necesario además de buscar elementos dentro de en un vector. Existe una gran variedad de métodos de ordenamiento que nos permiten organizar con rapidez los elementos que se encuentran dentro de un vector o archivo. Al llegar a este punto resulta que el valor mayor del arreglo quedara ubicado en la última posición del mismo. entonces los dos elementos están mal ubicados y procedemos a intercambiarlos de posición. pero teniendo en cuenta que como ya acomodamos en la posición correcta el mayor elemento. Luego se comparan los elementos de las posiciones 2 y 3 y se procede de igual manera. El proceso se repite de nuevo iniciando otra vez desde la posición 1 del vector. Se continua así hasta comparar los elementos de las ultimas dos posiciones. que reducimos en uno el número de comparaciones hechas para acomodar el primer elemento. Para entender el concepto de los métodos de ordenamiento en este documento desarrollaremos un ejercicio. Para el caso de ordenamiento ascendente (de menor a mayor) se compara cada elemento con el que le sigue inmediatamente usando el operador mayor que (>). Método de ordenamiento por Burbuja: Este método consiste en comparar los elementos del arreglo que se encuentran en posiciones adyacentes empezando desde la primera posición y llegando hasta el final del arreglo. Este ordenamiento puede ser de mayor a menor si estamos manejando números y en orden alfabético si se trata de nombres o caracteres. Intercambio. haciendo el intercambio si es preciso. shell. Entre los métodos de ordenamiento mas populares encontramos: Burbuja. la ultima comparación que se hará será entre los elementos de las posiciones penúltima y antepenúltima. etc. La comparación dependerá si estamos ordenando el arreglo en forma ascendente o descendente. Seguidamente se comparan los elementos de las posiciones restantes del vector y se realiza el intercambio si es necesario. quick-sort. Implementación del método que intercambia los elementos de dos posiciones del vector. este método se utilizara para mostrar la implementación de los otros dos métodos de ordenamiento: . en donde se implementan tres de los métodos mencionados para ordenar un vector de números enteros. es decir estará en su posición correcta. ordenarlos. La elección de un determinado método de ordenamiento depende de el tamaño del vector que se desea ordenar.

j+1). si quiero hacerlo de mayor a menor simplemente cambio el signo. var //Variables que controlan los ciclos que recorren el vector para comparar e intercambiar los elementos. este método compara elementos de la forma j. o el valor mas grande del arreglo si estamos . El trabajo que hace este método para ordenar un arreglo consiste en comparar cada elemento del arreglo con todos los que le siguen. Si los elementos que se comparan no están en el orden adecuado entonces se procede a intercambiarlos de posición. begin for i:=1 to num do begin for j:=1 to num-i do begin //Ordeno de menor a mayor. end. De esta manera el método empieza comparando el primer elemento del vector con todos los que le siguen. //aquí comparo si el elemento de la izquierda (j) es mayor que el elemento contiguo de la derecha (j+1). if getVector(j) > getVector(j+1) then begin //Para hacer el intercambio en los elementos llamo al método cambiar.cambiar(p1. begin temp:=vector[p1]. //Para implementar el ordenamiento burbuja utilizamos dos ciclos. end. //si se cumple la condición los intercambio. haciendo intercambios en cada comparación cuando los elementos comparados no estén en el orden adecuado. Al final de todas las comparaciones hechas con el primer elemento resulta que queda un valor acomodado en la primera posición del arreglo. que será el valor mas pequeño si estamos ordenado de menor a mayor. desde la posición uno hasta la ultima posición valida dentro del arreglo.procedure TOrdenamientos. Método de Ordenamiento Por Intercambio: El método de intercambio es uno de los mas sencillos de comprender e implementar.j+1. vector[p1]:=vector[p2]. o sea los que están a su derecha.j:integer. end. vector[p2]:=temp. end. por esta razón utilizamos dos //variables para controlar los ciclos que comparan e intercambia elementos. end.ordenarBurbuja. declarado anteriormente. i. cambiar(j. pero así mismo uno de los menos eficientes. var temp:integer. p2: integer). Implementación del método de ordenamiento Burbuja. Es decir compara dos posiciones seguidas o continuas del vector: procedure TOrdenamientos. es decir con aquellos que ocupan posiciones mayores que el.

min:=getVector(inicio). end. var //Variables que controlan los ciclos que recorren el vector para comparar e intercambiar los elementos. min:integer. luego busca el segundo elemento mas pequeño y procede a colocarlo en la segunda posición del vector.i+2. declarado anteriormente. pMin:integer. end.ordenando de mayor a menor. if getVector(i) > getVector(j) then begin //Para hacer el intercambio en los elementos llamo al método cambiar. Implementación del método auxiliar para buscar la posición del elemento mas pequeño del vector y realizar el intercambio: function TOrdenamientos. //variable para establecer la posición del elemento menor. es decir con los i+1. var i:integer. Para la implementación de este método primero buscamos la posición del elemento mas pequeño del vector y se realiza el intercambio con el primer elemento del vector. j:integer. si quiero hacerlo de mayor a menor simplemente cambio el signo. . begin pMin:=inicio. esto se repite hasta que se ordenan todos los elementos del vector. i. desde la posición del tercer elemento hasta el último. El proceso se repite comparando los elementos siguientes con todos los que están a su derecha. hasta que en la ultima pasada solo se comparan los elementos de la penúltima y de la ultima posición del arreglo. Teniendo en cuenta esto se procede a comparar el segundo elemento del arreglo con todos los que le siguen.posMenor(inicio: integer): integer. //variable para representar el elemento menor del vector. Este método compara un elemento de la posición i con todos los que le siguen. Luego se buscan los elementos restantes hasta que solo quede el mayor. end. cambiar(i. for i:=inicio+1 to num do begin //compara si el elemento de la derecha es menor que el elemento anterior (izquierda). j). end. //aquí compara si el elemento de la posición (i) a la izquierda es mayor que el elemento de la posición (j) //ubicado hacia la derecha. Método de ordenamiento por selección: Este método busca el elemento de menor valor dentro del vector y lo coloca en la primera posición. Implementación del método de ordenamiento por intercambio. //Variable que controla el ciclo que recorre el vector para obtener el elemento menor.i+3: procedure TOrdenamientos.ordenarIntercambio. momento en que ya queda ordenado el arreglo. begin for i:=1 to num do begin for j:=i+1 to num do begin //Ordeno de menor a mayor.

y uno para capturar los números. para implementar todo el cogido que tendrá el formulario. así como los métodos de ordenamiento que solucionan el problema planteado. Tenemos que tener en cuenta la propiedad Associate del TUpDown (Up) para asociarlo con el TEdit (pos) e iniciar la propiedad Max en 1.if getVector(i) < min then begin min:=getVector(i). posMenor(i)). Cada vez que obtengo la posición del menor elemento del vector implemento el método que intercambia dicho elemento a la primera posición del vector y así sucesivamente: procedure TOrdenamientos. limpiar y salir de la aplicación. end. para ordenar los elementos almacenados dentro del array. pMin:=i. Los nombres que se utilizaran para los TButton son: bGuardar. en donde se capturan los datos y se muestra la información. En esta clase se declara el vector y sus respectivos métodos selectores. Creamos un nuevo proyecto para implementar el ejercicio y automáticamente se crea una unidad con la clase TForm1. bLimpiar. Para el diseño del formulario (clase TForm1). se utilizaran los siguientes componentes con sus respectivos nombres: ● Dos TEdit (campos de texto).ordenarSeleccion. end. uno para mostrar las diferentes posiciones de cada indice en el vector. end. Procedemos a guardar esta unidad con el nombre UventanaOrdenamientos. A continuación se crea la unidad en donde se implementara el código de la clase lógica y se guarda con el nombre UOrdenamientos. ● ● . end. bSalir y bOrdenar respectivamente. A continuación implementaremos un ejercicio que permite almacenar números enteros en un vector y posteriormente implementamos los métodos de ordenamiento descritos anteriormente. para ir guardando los elementos. Un TUpDown que llamaremos Up para ir incrementando las posiciones del campo de texto pos de manera automática. end. var i:integer. Cinco TButton (botones). Además un ultimo botón para realizar el ordenamiento indicado. modificadores. llenar el vector con números aleatorios. bLlenar. begin for i:=1 to num do begin cambiar(i. Result:=pMin. //El método devuelve la posición en donde esta el elemento menor del vector para realizar el intercambio //hacia la primera posición. Los nombres que se utilizaran para los TEdit son: pos y val respectivamente.

//Constante (opcional) para establecer el numero de elementos del vector. Intercambio y Selección. También se utilizaran varios TLabel para colocar los diferentes comentarios que aparecen en el formulario. . El TComboBox (op) en la propiedad Items tendrá las opciones: Burbuja. SysUtils. {$mode objfpc}{$H+} interface uses Classes. Un TComboBox de nombre op para seleccionar con que método (burbuja. a medida que se almacenen elementos en el vector y cuando se ordene. ● ● La apariencia del formulario sera lago parecida a la siguiente ventana: Implementación de la clase lógica TOrdenamientos en la unidad UOrdenamientos: unit UOrdenamientos. intercambio o selección) queremos realizar el ordenamiento del vector.● Un TListBox de nombre lisvec para visualizar el contenido del vector.

//método que llena automáticamente el vector con valores aleatorios. procedure ordenarSeleccion.setVector(p: integer. begin Result:=vector[p]. for i:=1 to num do begin . var i:integer.num] of integer. end. ve: integer). end. ve:integer). procedure ordenarBurbuja. var i:integer. //Método auxiliar para el ordenamiento por selección. procedure TOrdenamientos. procedure ordenarIntercambio. end. //Método para ordenar por burbuja. //métodos modificadores para los atributos (vector). implementation { TOrdenamientos } constructor TOrdenamientos. procedure setVector(p:integer. procedure llenarAzar. function getVector(p:integer): integer. procedure cambiar (p1.getVector(p: integer): integer. begin Randomize. function TOrdenamientos. //Iniciamos la generación de números aleatorios. procedure TOrdenamientos. begin for i:=1 to num do begin vector[i]:=0. //métodos selectores para los atributos (vector).const num=50. end. type { TOrdenamientos } TOrdenamientos=class private vector:array[1. end.Create. //Método auxiliar para intercambia los elementos de dos posiciones del arreglo. //Método para ordenar por selección. Este método busca la posición del elemento //mas pequeño entre inicio y el ultimo elemento del vector (num).. public //método constructor de la clase.llenarAzar. begin vector[p]:=ve. function posMenor (inicio: integer):integer. p2:integer). //Método para ordenar por intercambio. constructor Create.

. end. j+1). var i. begin pMin:=inicio.j:integer. procedure TOrdenamientos. end. procedure TOrdenamientos.ordenarIntercambio. end.ordenarBurbuja. . //Implementación del método que intercambia los elementos de dos posiciones del vector. end. var temp:integer. min:=getVector(inicio). //Implementación del método de ordenamiento Burbuja. end. p2: integer).//se llena el vector con números enteros entre -49 . function TOrdenamientos. (Random(100)-Random(50))). var i:integer. vector[p1]:=vector[p2]. //Implementación del método de ordenamiento por intercambio. begin for i:=1 to num do begin for j:=1 to num-i do begin if getVector(j) > getVector(j+1) then begin cambiar(j.cambiar(p1. j:integer. end. var i. min:integer. end. j). end. vector[p2]:=temp. begin temp:=vector[p1]. setVector(i. pMin:integer. end. 99. //Implementación del método auxiliar para buscar la posición del elemento mas pequeño del vector. end. begin for i:=1 to num do begin for j:=i+1 to num do begin if getVector(i) > getVector(j) then begin cambiar(i. for i:=inicio+1 to num do begin if getVector(i) < min then begin min:=getVector(i). end.posMenor(inicio: integer): integer. procedure TOrdenamientos.

bSalir: TButton. Implementación de la clase lógica TForm1 en la unidad UventanaOrdenamientos: unit UventanaOrdenamientos. procedure TOrdenamientos. end. Label3: TLabel. Controls. LResources. Result:=pMin. {$mode objfpc}{$H+} interface uses Classes. op: TComboBox. StdCtrls. procedure bGuardarClick(Sender: TObject). posMenor(i)). end. bLlenar: TButton. SysUtils. //Implementación del método que intercambia el elemento menor del vector a la posición i-esima. .pMin:=i. procedure FormClose(Sender: TObject. procedure bSalirClick(Sender: TObject). var i:integer. var CloseAction: TCloseAction). val: TEdit. Forms. end. Label4: TLabel. lisvec: TListBox. Label2: TLabel. procedure bLlenarClick(Sender: TObject). end. Up: TUpDown. UOrdenamientos. Graphics. private //Declaramos la instancia global (para que la usen todos los botones) y privada (atributo de la ventana). Label1: TLabel. bLimpiar: TButton. vec:TOrdenamientos.ordenarSeleccion. Dialogs. procedure FormCreate(Sender: TObject). type { TForm1 } TForm1 = class(TForm) bGuardar: TButton. pos: TEdit. end. procedure bLimpiarClick(Sender: TObject). ComCtrls. procedure bOrdenarClick(Sender: TObject). procedure FormShow(Sender: TObject). end. bOrdenar: TButton. begin for i:=1 to num do begin cambiar(i.

vec. end. public { public declarations } end. val.//Método para mostrar los elementos del vector en el TListBox (lisvec). 0). //implementación del evento para el botón limpiar.Clear.Position+1. mostrar. val. val.SetFocus. var ve:integer. procedure TForm1. end. procedure TForm1. end.bOrdenarClick(Sender: TObject).Position < num then begin Up.Text). begin lisvec.bLimpiarClick(Sender: TObject).Clear. begin ve:=StrToInt(val.bGuardarClick(Sender: TObject).Position. //implementación del código para el evento del botón guardar. begin val. var i:integer. procedure TForm1. //dependiendo del valor que tenga la propiedad ItemIndex del TComboBox (op). ve). end. procedure TForm1. procedure mostrar.Clear. end.setVector(i.FormShow(Sender: TObject). up. //Implementación del evento para botón que llena el vector con números aleatorios. begin lisvec.Position:=1. val. //Implementación del evento para botón que ordena el vector con un método de ordenamiento determinado. begin .SetFocus. implementation { TForm1 } //Implementación del evento OnShow para colocar el cursor en el TEdit de nombre val. procedure TForm1. mostrar. end. if Up.SetFocus. for i:=1 to num do begin vec. vec.llenarAzar.SetFocus.setVector(Up.Clear. var Form1: TForm1.Position:=Up.bLlenarClick(Sender: TObject). val.

mostrar. end.getVector(i))).Max:=num. el evento OnCreate. end.Clear. procedure TForm1. end. initialization {$I uventanaordenamientos. begin Close.ordenarSeleccion.lrs} end. var i:integer. end else if op. end.ItemIndex = 0 then begin vec. end else begin vec.FormCreate(Sender: TObject).Items. para implementar este código solo basta con //seleccionar el formulario y escoger en el inspector de objetos. end. mostrar. begin vec. begin vec:=TOrdenamientos. end. var CloseAction: TCloseAction). //implementación del evento para el botón salir.Free. //implementación del método que muestra los elementos del vector en TListBox (lisvec). procedure TForm1.if op. procedure TForm1. for i:=1 to num do begin lisvec. Up. mostrar. procedure TForm1. . begin lisvec.bSalirClick(Sender: TObject).FormClose(Sender: TObject. el evento OnClose.ordenarBurbuja.ordenarIntercambio.Add(IntToStr(vec.Create.ItemIndex = 1 then begin vec. //implementación del método que libera la instancia. //implementación del método para el evento constructor del formulario. Para implementar este código solo //basta con seleccionar el formulario y escoger en el inspector de objetos. mostrar. end.