martes, 19 de enero de 2010
lunes, 28 de diciembre de 2009
Metodo de Shell-Sort
Metodo de Shell-Sort
Es una version mejorda del metodo de insercion directa.
En el metodo de ordenaion por insercion directa cada elemento s compara para su ubicacion correcta en el arreglo con los elementos que se encuentra en la parte izquierda del mismo. Si el elemento a insertar es mas pequeño que el grupo de elementos que se encuentra a su izquierda, es necesario efectuar entonces varias comparaciones antes de su ubicacion.
CODIGO:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class shell extends JFrame{
int a[]=new int[10];
int i, n, j;
int max, mayor;
String salida1="", salida2="";
JTextArea areaSalida=new JTextArea(6,6);
JTextArea areaSalida2=new JTextArea(6,6);
JTextField numero=new JTextField(15);
public shell(){
super("Ordenamiento tipo shell");
JLabel etiqueta=new JLabel("Cuantos numeros quieres?");
JLabel etiqueta1=new JLabel("Los numeros son:");
JButton capturar=new JButton("Capturar");
capturar.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent evento){
captura();
}
}
);
JButton ordenar=new JButton("Ordenar");
ordenar.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent evento){
ordena(a,n);
}
}
);
Container contenedor=getContentPane();
contenedor.setLayout(new FlowLayout());
contenedor.add(etiqueta);
contenedor.add(numero);
contenedor.add(capturar);
contenedor.add(etiqueta1);
contenedor.add(areaSalida);
contenedor.add(ordenar);
contenedor.add(areaSalida2);
setSize(300,300);
setVisible(true);
}
public void captura(){
if (numero.getText().equals("")){
JOptionPane.showMessageDialog(null,"Escriba un nombre");
numero.setText("");
}
else{
a[i]=Integer.parseInt(numero.getText());
salida2+=a[i]+"\n";
i++;
numero.setText("");
if (i==5){
n=i;
JOptionPane.showMessageDialog(null,"Fin de la captura");
}
areaSalida.setText(salida2);
}
}
public void muestra(int nn,int a3[]){
for(int k=0;k salida1+=a3[k]+"\n";
areaSalida2.setText(salida1);
}
public int mayores(int ultimo,int a[]){
max=0;
for(i=0;i if(a[i]>=a[max]){
max=i;
mayor=max;
}
return (mayor);
}
public void ordena(int lista[], int n){
int inter=(n/2),x=0,i=0,j=0,k=0,aux;
while(inter>0){
for(i=inter;i x++;
j=i-inter;
while(j>=0){
k=j+inter;
if(lista[j]<=lista[k]){
j--;
}
else{
aux=lista[j];
lista[j]=lista[k];
lista[k]=aux;
j=j-inter;
}
}
}
inter=inter/2;
}
muestra(n,lista);
}
public static void main(String[] args) {
shell aplicacion5 = new shell();
aplicacion5.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
Es una version mejorda del metodo de insercion directa.
En el metodo de ordenaion por insercion directa cada elemento s compara para su ubicacion correcta en el arreglo con los elementos que se encuentra en la parte izquierda del mismo. Si el elemento a insertar es mas pequeño que el grupo de elementos que se encuentra a su izquierda, es necesario efectuar entonces varias comparaciones antes de su ubicacion.
CODIGO:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class shell extends JFrame{
int a[]=new int[10];
int i, n, j;
int max, mayor;
String salida1="", salida2="";
JTextArea areaSalida=new JTextArea(6,6);
JTextArea areaSalida2=new JTextArea(6,6);
JTextField numero=new JTextField(15);
public shell(){
super("Ordenamiento tipo shell");
JLabel etiqueta=new JLabel("Cuantos numeros quieres?");
JLabel etiqueta1=new JLabel("Los numeros son:");
JButton capturar=new JButton("Capturar");
capturar.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent evento){
captura();
}
}
);
JButton ordenar=new JButton("Ordenar");
ordenar.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent evento){
ordena(a,n);
}
}
);
Container contenedor=getContentPane();
contenedor.setLayout(new FlowLayout());
contenedor.add(etiqueta);
contenedor.add(numero);
contenedor.add(capturar);
contenedor.add(etiqueta1);
contenedor.add(areaSalida);
contenedor.add(ordenar);
contenedor.add(areaSalida2);
setSize(300,300);
setVisible(true);
}
public void captura(){
if (numero.getText().equals("")){
JOptionPane.showMessageDialog(null,"Escriba un nombre");
numero.setText("");
}
else{
a[i]=Integer.parseInt(numero.getText());
salida2+=a[i]+"\n";
i++;
numero.setText("");
if (i==5){
n=i;
JOptionPane.showMessageDialog(null,"Fin de la captura");
}
areaSalida.setText(salida2);
}
}
public void muestra(int nn,int a3[]){
for(int k=0;k
areaSalida2.setText(salida1);
}
public int mayores(int ultimo,int a[]){
max=0;
for(i=0;i
max=i;
mayor=max;
}
return (mayor);
}
public void ordena(int lista[], int n){
int inter=(n/2),x=0,i=0,j=0,k=0,aux;
while(inter>0){
for(i=inter;i
j=i-inter;
while(j>=0){
k=j+inter;
if(lista[j]<=lista[k]){
j--;
}
else{
aux=lista[j];
lista[j]=lista[k];
lista[k]=aux;
j=j-inter;
}
}
}
inter=inter/2;
}
muestra(n,lista);
}
public static void main(String[] args) {
shell aplicacion5 = new shell();
aplicacion5.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
RadixSort
RadixSort
el algoritmo oredena una secuencia de pares, por esjemplo S, aplicandole dos veces un oredenamiento estable por cubetas: primero usando un componente del par como clave del ordenamiento y despues el segundo comportamiento, pero el correcto es el que se oredena se deve oredenar primero con la K y despues con las L el segundo componente al reves.
CODIGO:
import java.lang.*;
import java.io.*;
public class RadixSort{
public static void radixSort(int[] arr){
if(arr.length == 0)
return;
int[][] np = new int[arr.length][2];
int[] q = new int[0x100];
int i,j,k,l,f = 0;
for(k=0;k<4;k++){
for(i=0;i<(np.length-1);i++)
np[i][1] = i+1;
np[i][1] = -1;
for(i=0;i q[i] = -1;
for(f=i=0;i j = ((0xFF<<(k<<3))&arr[i])>>(k<<3);
if(q[j] == -1)
l = q[j] = f;
else{
l = q[j];
while(np[l][1] != -1)
l = np[l][1];
np[l][1] = f;
l = np[l][1];
}
f = np[f][1];
np[l][0] = arr[i];
np[l][1] = -1;
}
for(l=q[i=j=0];i<0x100;i++)
for(l=q[i];l!=-1;l=np[l][1])
arr[j++] = np[l][0];
}
}
public static void main(String[] args){
int i;
int[] arr = { 1212, 117, 839, 1382, 741, 1357, 1293, 899, 1202, 1227, 982, 1153,
15, 831 ,1202, 287, 417, 329, 674, 1375, 142, 1368, 1395, 1317, 810, 471, 288, 117, 1285,........................, 1313, 5};
System.out.print("original: ");
for(i=0;i System.out.print(arr[i] + " ");
}
System.out.print("\nsorted: ");
for(i=0;i System.out.print(arr[i] + " ");
System.out.println("\nDone ;-)");
}
}
el algoritmo oredena una secuencia de pares, por esjemplo S, aplicandole dos veces un oredenamiento estable por cubetas: primero usando un componente del par como clave del ordenamiento y despues el segundo comportamiento, pero el correcto es el que se oredena se deve oredenar primero con la K y despues con las L el segundo componente al reves.
CODIGO:
import java.lang.*;
import java.io.*;
public class RadixSort{
public static void radixSort(int[] arr){
if(arr.length == 0)
return;
int[][] np = new int[arr.length][2];
int[] q = new int[0x100];
int i,j,k,l,f = 0;
for(k=0;k<4;k++){
for(i=0;i<(np.length-1);i++)
np[i][1] = i+1;
np[i][1] = -1;
for(i=0;i
for(f=i=0;i
if(q[j] == -1)
l = q[j] = f;
else{
l = q[j];
while(np[l][1] != -1)
l = np[l][1];
np[l][1] = f;
l = np[l][1];
}
f = np[f][1];
np[l][0] = arr[i];
np[l][1] = -1;
}
for(l=q[i=j=0];i<0x100;i++)
for(l=q[i];l!=-1;l=np[l][1])
arr[j++] = np[l][0];
}
}
public static void main(String[] args){
int i;
int[] arr = { 1212, 117, 839, 1382, 741, 1357, 1293, 899, 1202, 1227, 982, 1153,
15, 831 ,1202, 287, 417, 329, 674, 1375, 142, 1368, 1395, 1317, 810, 471, 288, 117, 1285,........................, 1313, 5};
System.out.print("original: ");
for(i=0;i
}
System.out.print("\nsorted: ");
for(i=0;i
System.out.println("\nDone ;-)");
}
}
ARBOL BINARIO
Metodo De Arbol binario
es aquel en el cual las ramas de los nodos del arbol estan ordenadas. Los arboles ordenados de grado 2 son de especial interes puesto que representa una dxe las estructiras de datos mas importantes en computacion.
Un arbol binario cada nodo puede tener como maximo dos subarboles y siempre es necesario distinguir entre el subarbol izquierdo y el subarbol derecho.
se define un arbol binario tipo T como una estructura homogenea que es la concatenacion de un elemento de tipo T, llamada raiz, con dos arboles binarios dijuntos, llamados subarbol izquierdo y subarbol derecho de la raiz.
CODIGO:
class NodoArbol{
NodoArbol li,ld;
int dato;
public NodoArbol(int d){
dato=d;
li=ld=null;
}
public synchronized void insertar(int d){
if(d if(li==null){
li=new NodoArbol(d);
}
else{
li.insertar(d);
}
}
if(d>dato){
if(ld==null){
ld=new NodoArbol(d);
}
else{
ld.insertar(d);
}
}
}//fin insertar
public int retornadato(){
return(dato);
}//end retornadato
}
public class Arbol {
private NodoArbol raiz;
public Arbol() {
raiz=null;
}
public NodoArbol retornaraiz(){
return(raiz);
}
public synchronized void insertarNodo(int d){
if(raiz==null){
raiz=new NodoArbol(d);
//primero=raiz;
}
else{
raiz.insertar(d);
}
}//fin insertarNodo
public synchronized String preorden(){
String pre=ayudantepreorden(raiz);
return(pre);
}
private String ayudantepreorden(NodoArbol nodo){
String cadena=new String();
if(nodo!=null){
//return;
//System.out.print(nodo.dato+" ");
cadena=cadena+String.valueOf(nodo.dato+" ");
cadena=cadena+ayudantepreorden(nodo.li);
cadena=cadena+ayudantepreorden(nodo.ld);
}
else{
cadena="";
}
return(cadena);
}
public synchronized String inorden(){
String inor=ayudanteinorden(raiz);
return(inor);
}
private String ayudanteinorden(NodoArbol nodo){
String cadena=new String();
if(nodo!=null){
// return;
cadena=cadena+ayudanteinorden(nodo.li);
cadena=cadena+nodo.dato+" ";
cadena=cadena+ayudanteinorden(nodo.ld);
}
else{cadena="";}
return(cadena);
}
public synchronized String posorden(){
String pos=ayudanteposorden(raiz);
return(pos);
}
private String ayudanteposorden(NodoArbol nodo){
String cadena=new String();
if(nodo!=null){
cadena=cadena+ayudanteposorden(nodo.li);
cadena=cadena+ayudanteposorden(nodo.ld);
cadena=cadena+nodo.dato+" ";
}
else{cadena="";}
return(cadena);
}
public synchronized int altura(NodoArbol R){
NodoArbol p=R;
int altizq=p.li==null ? 1:1+altura(p.li);
int altder=p.ld==null ? 1:1+altura(p.ld);
return(Math.max(altizq,altder));
}//end altura
public synchronized int hojas(NodoArbol R){
NodoArbol p=R;
int hojas=0;
if(p.li==null & p.ld==null){
hojas=1;
}
else{
if(p.li!=null){
hojas=hojas+hojas(p.li);
}
if(p.ld!=null){
hojas=hojas+hojas(p.ld);
}
}
return(hojas);
}//end hojas
public synchronized String ancestros(NodoArbol R,int d){
NodoArbol p=R;
String h=new String();
if (p.dato==d){
return(String.valueOf(" --> "+d));
}//end if
if (d>p.dato){
h=h+" --> "+p.dato+ancestros(p.ld,d);
}
else{
h=h+" --> "+p.dato+ancestros(p.li,d);
}
return(h);
}
}
es aquel en el cual las ramas de los nodos del arbol estan ordenadas. Los arboles ordenados de grado 2 son de especial interes puesto que representa una dxe las estructiras de datos mas importantes en computacion.
Un arbol binario cada nodo puede tener como maximo dos subarboles y siempre es necesario distinguir entre el subarbol izquierdo y el subarbol derecho.
se define un arbol binario tipo T como una estructura homogenea que es la concatenacion de un elemento de tipo T, llamada raiz, con dos arboles binarios dijuntos, llamados subarbol izquierdo y subarbol derecho de la raiz.
CODIGO:
class NodoArbol{
NodoArbol li,ld;
int dato;
public NodoArbol(int d){
dato=d;
li=ld=null;
}
public synchronized void insertar(int d){
if(d
li=new NodoArbol(d);
}
else{
li.insertar(d);
}
}
if(d>dato){
if(ld==null){
ld=new NodoArbol(d);
}
else{
ld.insertar(d);
}
}
}//fin insertar
public int retornadato(){
return(dato);
}//end retornadato
}
public class Arbol {
private NodoArbol raiz;
public Arbol() {
raiz=null;
}
public NodoArbol retornaraiz(){
return(raiz);
}
public synchronized void insertarNodo(int d){
if(raiz==null){
raiz=new NodoArbol(d);
//primero=raiz;
}
else{
raiz.insertar(d);
}
}//fin insertarNodo
public synchronized String preorden(){
String pre=ayudantepreorden(raiz);
return(pre);
}
private String ayudantepreorden(NodoArbol nodo){
String cadena=new String();
if(nodo!=null){
//return;
//System.out.print(nodo.dato+" ");
cadena=cadena+String.valueOf(nodo.dato+" ");
cadena=cadena+ayudantepreorden(nodo.li);
cadena=cadena+ayudantepreorden(nodo.ld);
}
else{
cadena="";
}
return(cadena);
}
public synchronized String inorden(){
String inor=ayudanteinorden(raiz);
return(inor);
}
private String ayudanteinorden(NodoArbol nodo){
String cadena=new String();
if(nodo!=null){
// return;
cadena=cadena+ayudanteinorden(nodo.li);
cadena=cadena+nodo.dato+" ";
cadena=cadena+ayudanteinorden(nodo.ld);
}
else{cadena="";}
return(cadena);
}
public synchronized String posorden(){
String pos=ayudanteposorden(raiz);
return(pos);
}
private String ayudanteposorden(NodoArbol nodo){
String cadena=new String();
if(nodo!=null){
cadena=cadena+ayudanteposorden(nodo.li);
cadena=cadena+ayudanteposorden(nodo.ld);
cadena=cadena+nodo.dato+" ";
}
else{cadena="";}
return(cadena);
}
public synchronized int altura(NodoArbol R){
NodoArbol p=R;
int altizq=p.li==null ? 1:1+altura(p.li);
int altder=p.ld==null ? 1:1+altura(p.ld);
return(Math.max(altizq,altder));
}//end altura
public synchronized int hojas(NodoArbol R){
NodoArbol p=R;
int hojas=0;
if(p.li==null & p.ld==null){
hojas=1;
}
else{
if(p.li!=null){
hojas=hojas+hojas(p.li);
}
if(p.ld!=null){
hojas=hojas+hojas(p.ld);
}
}
return(hojas);
}//end hojas
public synchronized String ancestros(NodoArbol R,int d){
NodoArbol p=R;
String h=new String();
if (p.dato==d){
return(String.valueOf(" --> "+d));
}//end if
if (d>p.dato){
h=h+" --> "+p.dato+ancestros(p.ld,d);
}
else{
h=h+" --> "+p.dato+ancestros(p.li,d);
}
return(h);
}
}
Metodo De Quick-Sort
Metodo De Quick-Sort
Se basa en el paradigma de divide y venceras, pero usa esta tecnica en forma algo contraria por que todo el trabajo duro se hace antes de las llamadas recursivas.
El ordenamiento rapido ordena una secuencia s en subsecuencias, se hace recursion para ordenar cada subsecuencia y a continuacion se combinan las secuencias ordenada sin mediante una simple concatenacion.
CODIGO DE QUICK-SORT (enteros y flotantes)
ENTEROS
public class quicksort {
public static void qsort(Comparable [] c, int inicio, int fin) {
if(fin<=inicio) return;
Comparable comp=c[inicio];
int i=inicio, j=fin+1;
for(;;){
do i++;while(i do j--;while(j>inicio && c[j].compareTo(comp)>0 );
if (j<=i) break;
Comparable tmp=c[i];
c[i]=c[j];
c[j]=tmp;
}
c[inicio]=c[j];
c[j]=comp;
qsort(c, inicio, j-1);
qsort(c, j+1, fin);
}
public static void qsort(Comparable[] c){
qsort(c, 0, c.length-1);
}
public static void main(String[] args){
int i;
Integer[] arr=new Integer [100];
System.out.println("Elementos aleatorios:");
for(i=0; i arr[i]=new Integer((int)(Math.random()*99));
System.out.print(arr[i]+"");
}
quicksort.qsort(arr);
System.out.println("\nelementos ordenados:");
for(i=0; i System.out.print(arr[i]+"");
}
}
Se basa en el paradigma de divide y venceras, pero usa esta tecnica en forma algo contraria por que todo el trabajo duro se hace antes de las llamadas recursivas.
El ordenamiento rapido ordena una secuencia s en subsecuencias, se hace recursion para ordenar cada subsecuencia y a continuacion se combinan las secuencias ordenada sin mediante una simple concatenacion.
CODIGO DE QUICK-SORT (enteros y flotantes)
ENTEROS
public class quicksort {
public static void qsort(Comparable [] c, int inicio, int fin) {
if(fin<=inicio) return;
Comparable comp=c[inicio];
int i=inicio, j=fin+1;
for(;;){
do i++;while(i
if (j<=i) break;
Comparable tmp=c[i];
c[i]=c[j];
c[j]=tmp;
}
c[inicio]=c[j];
c[j]=comp;
qsort(c, inicio, j-1);
qsort(c, j+1, fin);
}
public static void qsort(Comparable[] c){
qsort(c, 0, c.length-1);
}
public static void main(String[] args){
int i;
Integer[] arr=new Integer [100];
System.out.println("Elementos aleatorios:");
for(i=0; i
System.out.print(arr[i]+"");
}
quicksort.qsort(arr);
System.out.println("\nelementos ordenados:");
for(i=0; i
}
}
metodo de burbuja
Metodo de Burbuja
Es otro algoritmo de metodo ordenacion secuencial que utiliza dos bucles anidados. En estes metodo, se ordena los valores comparando repetivamente los elementos adyasentes de la lista intercambiando su posicion si no se encuentran en orden relativo corecto.
Cada pasada del algorimo de la burbuja hace que se desplace el valor mas grande hasta su posicion final a lo largo de esa pasada, tambien pueden reposicionarse otros elementos.
CODIGO DE BURBUJA (con numeros enteros y flotantes)
class Main {
public static float izquierda,derecha,ultimo; //variables para ordenamiento
public static double arreglo[] = {10.2,23.53,1.8,2.3,3.2,4.5,5.39,6.9,7.9,6.7,8.1,678.3,57.3,4.6,3.56,5.56,3.4,5.67,89.6,67.8,9.6,4.5,7.7,6.89,....................., 4.5,7.7,6.89,8.7};
public static void main(String[] args) {
izquierda = 1;
derecha = arreglo.length;
ultimo = arreglo.length-1;
do{
for(int i=arreglo.length-1;i>0;i--){
//Burbuja hacia la izquierda
//Los valores menores van a la izquierda
if (arreglo[i-1] > arreglo[i]){
double aux = arreglo[i]; // variable auxiliar para poder hacer intercambio de
arreglo[i] = arreglo[i-1]; // posicion
arreglo[i-1] = aux;
ultimo = i;
}
}
izquierda = ultimo+1;
for(int j=1;j if(arreglo[j-1] > arreglo[j]){
double aux = arreglo[j];
arreglo[j] = arreglo[j-1];
arreglo[j-1] = aux;
ultimo = j;
}
}
derecha = ultimo-1;
}while(derecha >= izquierda);
for(int i=0;i System.out.println(arreglo[i]);
}
}
}
Es otro algoritmo de metodo ordenacion secuencial que utiliza dos bucles anidados. En estes metodo, se ordena los valores comparando repetivamente los elementos adyasentes de la lista intercambiando su posicion si no se encuentran en orden relativo corecto.
Cada pasada del algorimo de la burbuja hace que se desplace el valor mas grande hasta su posicion final a lo largo de esa pasada, tambien pueden reposicionarse otros elementos.
CODIGO DE BURBUJA (con numeros enteros y flotantes)
class Main {
public static float izquierda,derecha,ultimo; //variables para ordenamiento
public static double arreglo[] = {10.2,23.53,1.8,2.3,3.2,4.5,5.39,6.9,7.9,6.7,8.1,678.3,57.3,4.6,3.56,5.56,3.4,5.67,89.6,67.8,9.6,4.5,7.7,6.89,....................., 4.5,7.7,6.89,8.7};
public static void main(String[] args) {
izquierda = 1;
derecha = arreglo.length;
ultimo = arreglo.length-1;
do{
for(int i=arreglo.length-1;i>0;i--){
//Burbuja hacia la izquierda
//Los valores menores van a la izquierda
if (arreglo[i-1] > arreglo[i]){
double aux = arreglo[i]; // variable auxiliar para poder hacer intercambio de
arreglo[i] = arreglo[i-1]; // posicion
arreglo[i-1] = aux;
ultimo = i;
}
}
izquierda = ultimo+1;
for(int j=1;j
double aux = arreglo[j];
arreglo[j] = arreglo[j-1];
arreglo[j-1] = aux;
ultimo = j;
}
}
derecha = ultimo-1;
}while(derecha >= izquierda);
for(int i=0;i
}
}
}
Suscribirse a:
Entradas (Atom)
