Vous êtes sur la page 1sur 11

Mtodos de Ordenamiento

Pedro Guevara Salgado Lus Olascoaga

Universidad de Crdoba Facultad de Ciencias Bsicas e Ingenieras Departamento de Ingeniera de Sistemas y Telecomunicaciones

Mtodos de Ordenamiento Muchas veces es necesario adems de buscar elementos dentro de en un vector, ordenarlos. Este ordenamiento puede ser de mayor a menor si estamos manejando nmeros y en orden alfabtico si se trata de nombres o caracteres. Existe una gran variedad de mtodos de ordenamiento que nos permiten organizar con rapidez los elementos que se encuentran dentro de un vector o archivo. La eleccin de un determinado mtodo de ordenamiento depende de el tamao del vector que se desea ordenar. Entre los mtodos de ordenamiento mas populares encontramos: Burbuja, Intercambio, seleccin, shell, quick-sort, etc. Para entender el concepto de los mtodos de ordenamiento en este documento desarrollaremos un ejercicio, en donde se implementan tres de los mtodos mencionados para ordenar un vector de nmeros enteros. Mtodo de ordenamiento por Burbuja: Este mtodo consiste en comparar los elementos del arreglo que se encuentran en posiciones adyacentes empezando desde la primera posicin y llegando hasta el final del arreglo. La comparacin depender si estamos ordenando el arreglo en forma ascendente o descendente. 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 (>). Si el elemento de la posicin de la izquierda es mayor que el elemento de la posicin que le sigue a su derecha, entonces los dos elementos estn mal ubicados y procedemos a intercambiarlos de posicin. El proceso empieza entonces comparando los elementos de la posiciones 1 y 2 del vector, haciendo el intercambio si es preciso. Luego se comparan los elementos de las posiciones 2 y 3 y se procede de igual manera. Seguidamente se comparan los elementos de las posiciones restantes del vector y se realiza el intercambio si es necesario. Se continua as hasta comparar los elementos de las ultimas dos posiciones. Al llegar a este punto resulta que el valor mayor del arreglo quedara ubicado en la ltima posicin del mismo, es decir estar en su posicin correcta. El proceso se repite de nuevo iniciando otra vez desde la posicin 1 del vector, pero teniendo en cuenta que como ya acomodamos en la posicin correcta el mayor elemento, la ultima comparacin que se har ser entre los elementos de las posiciones penltima y antepenltima. Es decir, que reducimos en uno el nmero de comparaciones hechas para acomodar el primer elemento. Implementacin del mtodo que intercambia los elementos de dos posiciones del vector, este mtodo se utilizara para mostrar la implementacin de los otros dos mtodos de ordenamiento:

procedure TOrdenamientos.cambiar(p1, p2: integer); var temp:integer; begin temp:=vector[p1]; vector[p1]:=vector[p2]; vector[p2]:=temp; end;

Implementacin del mtodo de ordenamiento Burbuja, este mtodo compara elementos de la forma j,j+1. Es decir compara dos posiciones seguidas o continuas del vector:
procedure TOrdenamientos.ordenarBurbuja; //Para implementar el ordenamiento burbuja utilizamos dos ciclos, por esta razn utilizamos dos //variables para controlar los ciclos que comparan e intercambia elementos. var //Variables que controlan los ciclos que recorren el vector para comparar e intercambiar los elementos. i,j:integer; begin for i:=1 to num do begin for j:=1 to num-i do begin //Ordeno de menor a mayor, si quiero hacerlo de mayor a menor simplemente cambio el signo, //aqu comparo si el elemento de la izquierda (j) es mayor que el elemento contiguo de la derecha (j+1). //si se cumple la condicin los intercambio. if getVector(j) > getVector(j+1) then begin //Para hacer el intercambio en los elementos llamo al mtodo cambiar, declarado anteriormente. cambiar(j, j+1); end; end; end; end;

Mtodo de Ordenamiento Por Intercambio: El mtodo de intercambio es uno de los mas sencillos de comprender e implementar, pero as mismo uno de los menos eficientes. El trabajo que hace este mtodo para ordenar un arreglo consiste en comparar cada elemento del arreglo con todos los que le siguen, es decir con aquellos que ocupan posiciones mayores que el, o sea los que estn a su derecha. Si los elementos que se comparan no estn en el orden adecuado entonces se procede a intercambiarlos de posicin. De esta manera el mtodo empieza comparando el primer elemento del vector con todos los que le siguen, desde la posicin uno hasta la ultima posicin valida dentro del arreglo, haciendo intercambios en cada comparacin cuando los elementos comparados no estn en el orden adecuado. Al final de todas las comparaciones hechas con el primer elemento resulta que queda un valor acomodado en la primera posicin del arreglo, que ser el valor mas pequeo si estamos ordenado de menor a mayor, o el valor mas grande del arreglo si estamos

ordenando de mayor a menor. Teniendo en cuenta esto se procede a comparar el segundo elemento del arreglo con todos los que le siguen, desde la posicin del tercer elemento hasta el ltimo. El proceso se repite comparando los elementos siguientes con todos los que estn a su derecha, hasta que en la ultima pasada solo se comparan los elementos de la penltima y de la ultima posicin del arreglo, momento en que ya queda ordenado el arreglo. Implementacin del mtodo de ordenamiento por intercambio. Este mtodo compara un elemento de la posicin i con todos los que le siguen, es decir con los i+1,i+2,i+3:
procedure TOrdenamientos.ordenarIntercambio; var //Variables que controlan los ciclos que recorren el vector para comparar e intercambiar los elementos. i, j:integer; begin for i:=1 to num do begin for j:=i+1 to num do begin //Ordeno de menor a mayor, si quiero hacerlo de mayor a menor simplemente cambio el signo, //aqu compara si el elemento de la posicin (i) a la izquierda es mayor que el elemento de la posicin (j) //ubicado hacia la derecha. if getVector(i) > getVector(j) then begin //Para hacer el intercambio en los elementos llamo al mtodo cambiar, declarado anteriormente. cambiar(i, j); end; end; end; end;

Mtodo de ordenamiento por seleccin: Este mtodo busca el elemento de menor valor dentro del vector y lo coloca en la primera posicin, luego busca el segundo elemento mas pequeo y procede a colocarlo en la segunda posicin del vector, esto se repite hasta que se ordenan todos los elementos del vector. Para la implementacin de este mtodo primero buscamos la posicin del elemento mas pequeo del vector y se realiza el intercambio con el primer elemento del vector. Luego se buscan los elementos restantes hasta que solo quede el mayor. Implementacin del mtodo auxiliar para buscar la posicin del elemento mas pequeo del vector y realizar el intercambio:
function TOrdenamientos.posMenor(inicio: integer): integer; var i:integer; //Variable que controla el ciclo que recorre el vector para obtener el elemento menor. pMin:integer; //variable para establecer la posicin del elemento menor. min:integer; //variable para representar el elemento menor del vector. begin pMin:=inicio; min:=getVector(inicio); for i:=inicio+1 to num do begin //compara si el elemento de la derecha es menor que el elemento anterior (izquierda).

if getVector(i) < min then begin min:=getVector(i); pMin:=i; end; end; //El mtodo devuelve la posicin en donde esta el elemento menor del vector para realizar el intercambio //hacia la primera posicin. Result:=pMin; end;

Cada vez que obtengo la posicin del menor elemento del vector implemento el mtodo que intercambia dicho elemento a la primera posicin del vector y as sucesivamente:
procedure TOrdenamientos.ordenarSeleccion; var i:integer; begin for i:=1 to num do begin cambiar(i, posMenor(i)); end; end;

A continuacin implementaremos un ejercicio que permite almacenar nmeros enteros en un vector y posteriormente implementamos los mtodos de ordenamiento descritos anteriormente, para ordenar los elementos almacenados dentro del array. Creamos un nuevo proyecto para implementar el ejercicio y automticamente se crea una unidad con la clase TForm1. Procedemos a guardar esta unidad con el nombre UventanaOrdenamientos, para implementar todo el cogido que tendr el formulario. A continuacin se crea la unidad en donde se implementara el cdigo de la clase lgica y se guarda con el nombre UOrdenamientos. En esta clase se declara el vector y sus respectivos mtodos selectores, modificadores, as como los mtodos de ordenamiento que solucionan el problema planteado. Para el diseo del formulario (clase TForm1), en donde se capturan los datos y se muestra la informacin, se utilizaran los siguientes componentes con sus respectivos nombres:

Dos TEdit (campos de texto), uno para mostrar las diferentes posiciones de cada indice en el vector, y uno para capturar los nmeros. Los nombres que se utilizaran para los TEdit son: pos y val respectivamente. Un TUpDown que llamaremos Up para ir incrementando las posiciones del campo de texto pos de manera automtica. Tenemos que tener en cuenta la propiedad Associate del TUpDown (Up) para asociarlo con el TEdit (pos) e iniciar la propiedad Max en 1. Cinco TButton (botones), para ir guardando los elementos, llenar el vector con nmeros aleatorios, limpiar y salir de la aplicacin. Adems un ultimo botn para realizar el ordenamiento indicado. Los nombres que se utilizaran para los TButton son: bGuardar, bLlenar, bLimpiar, bSalir y bOrdenar respectivamente.

Un TListBox de nombre lisvec para visualizar el contenido del vector, a medida que se almacenen elementos en el vector y cuando se ordene. Un TComboBox de nombre op para seleccionar con que mtodo (burbuja, intercambio o seleccin) queremos realizar el ordenamiento del vector. El TComboBox (op) en la propiedad Items tendr las opciones: Burbuja, Intercambio y Seleccin. Tambin se utilizaran varios TLabel para colocar los diferentes comentarios que aparecen en el formulario.

La apariencia del formulario sera lago parecida a la siguiente ventana:

Implementacin de la clase lgica TOrdenamientos en la unidad UOrdenamientos:


unit UOrdenamientos; {$mode objfpc}{$H+} interface uses Classes, SysUtils; //Constante (opcional) para establecer el numero de elementos del vector.

const num=50; type { TOrdenamientos } TOrdenamientos=class private vector:array[1..num] of integer; public //mtodo constructor de la clase. constructor Create; //mtodos modificadores para los atributos (vector). procedure setVector(p:integer; ve:integer); //mtodos selectores para los atributos (vector). function getVector(p:integer): integer; //mtodo que llena automticamente el vector con valores aleatorios. procedure llenarAzar; //Mtodo auxiliar para intercambia los elementos de dos posiciones del arreglo. procedure cambiar (p1, p2:integer); //Mtodo para ordenar por burbuja. procedure ordenarBurbuja; //Mtodo para ordenar por intercambio. procedure ordenarIntercambio; //Mtodo auxiliar para el ordenamiento por seleccin. Este mtodo busca la posicin del elemento //mas pequeo entre inicio y el ultimo elemento del vector (num). function posMenor (inicio: integer):integer; //Mtodo para ordenar por seleccin. procedure ordenarSeleccion; end; implementation { TOrdenamientos } constructor TOrdenamientos.Create; var i:integer; begin for i:=1 to num do begin vector[i]:=0; end; end; procedure TOrdenamientos.setVector(p: integer; ve: integer); begin vector[p]:=ve; end; function TOrdenamientos.getVector(p: integer): integer; begin Result:=vector[p]; end; procedure TOrdenamientos.llenarAzar; var i:integer; begin Randomize; //Iniciamos la generacin de nmeros aleatorios. for i:=1 to num do begin

//se llena el vector con nmeros enteros entre -49 .. 99. setVector(i, (Random(100)-Random(50))); end; end; //Implementacin del mtodo que intercambia los elementos de dos posiciones del vector. procedure TOrdenamientos.cambiar(p1, p2: integer); var temp:integer; begin temp:=vector[p1]; vector[p1]:=vector[p2]; vector[p2]:=temp; end; //Implementacin del mtodo de ordenamiento Burbuja. procedure TOrdenamientos.ordenarBurbuja; var i,j:integer; 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, j+1); end; end; end; end; //Implementacin del mtodo de ordenamiento por intercambio. procedure TOrdenamientos.ordenarIntercambio; var i, j:integer; 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, j); end; end; end; end; //Implementacin del mtodo auxiliar para buscar la posicin del elemento mas pequeo del vector. function TOrdenamientos.posMenor(inicio: integer): integer; var i:integer; pMin:integer; min:integer; begin pMin:=inicio; min:=getVector(inicio); for i:=inicio+1 to num do begin if getVector(i) < min then begin min:=getVector(i);

pMin:=i; end; end; Result:=pMin; end; //Implementacin del mtodo que intercambia el elemento menor del vector a la posicin i-esima. procedure TOrdenamientos.ordenarSeleccion; var i:integer; begin for i:=1 to num do begin cambiar(i, posMenor(i)); end; end; end.

Implementacin de la clase lgica TForm1 en la unidad UventanaOrdenamientos:


unit UventanaOrdenamientos; {$mode objfpc}{$H+} interface uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, UOrdenamientos, ComCtrls; type { TForm1 } TForm1 = class(TForm) bGuardar: TButton; bLimpiar: TButton; bSalir: TButton; bOrdenar: TButton; bLlenar: TButton; op: TComboBox; Label4: TLabel; lisvec: TListBox; val: TEdit; Label3: TLabel; pos: TEdit; Label1: TLabel; Label2: TLabel; Up: TUpDown; procedure FormClose(Sender: TObject; var CloseAction: TCloseAction); procedure FormCreate(Sender: TObject); procedure FormShow(Sender: TObject); procedure bGuardarClick(Sender: TObject); procedure bLimpiarClick(Sender: TObject); procedure bLlenarClick(Sender: TObject); procedure bOrdenarClick(Sender: TObject); procedure bSalirClick(Sender: TObject); private //Declaramos la instancia global (para que la usen todos los botones) y privada (atributo de la ventana). vec:TOrdenamientos;

//Mtodo para mostrar los elementos del vector en el TListBox (lisvec). procedure mostrar; public { public declarations } end; var Form1: TForm1; implementation { TForm1 } //Implementacin del evento OnShow para colocar el cursor en el TEdit de nombre val. procedure TForm1.FormShow(Sender: TObject); begin val.SetFocus; end; //implementacin del cdigo para el evento del botn guardar. procedure TForm1.bGuardarClick(Sender: TObject); var ve:integer; begin ve:=StrToInt(val.Text); vec.setVector(Up.Position, ve); if Up.Position < num then begin Up.Position:=Up.Position+1; end; mostrar; val.Clear; val.SetFocus; end; //implementacin del evento para el botn limpiar. procedure TForm1.bLimpiarClick(Sender: TObject); var i:integer; begin lisvec.Clear; for i:=1 to num do begin vec.setVector(i, 0); end; up.Position:=1; val.Clear; val.SetFocus; end; //Implementacin del evento para botn que llena el vector con nmeros aleatorios. procedure TForm1.bLlenarClick(Sender: TObject); begin lisvec.Clear; vec.llenarAzar; mostrar; val.SetFocus; end; //Implementacin del evento para botn que ordena el vector con un mtodo de ordenamiento determinado, //dependiendo del valor que tenga la propiedad ItemIndex del TComboBox (op). procedure TForm1.bOrdenarClick(Sender: TObject); begin

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

Vous aimerez peut-être aussi