Академический Документы
Профессиональный Документы
Культура Документы
QUICKSORT
1
`
TABLA DE CONTENIDO
1. Descripcin
2. Pseudocdigo
3. Optimizado
4. Anlisis del algoritmo
5. Implementacin en JAVA
6. Conclusin
7. Bibliografa
2
`
DESCRIPCIN
3
`
Pseudocdigo
Tabla de variables
Nombre Tipo Uso
lista Cualquiera Lista a ordenar
inf Entero Elemento inferior de la lista
sup Entero Elemento superior de la lista
El mismo que los elementos de la
elem_div El elemento divisor
lista
El mismo que los elementos de la
temp Para realizar los intercambios
lista
i Entero Contador por la izquierda
j Entero Contador por la derecha
El ciclo continua mientras cont tenga el
cont Entero
valor 1
// Inicializacin de variables
1. elem_div = lista[sup];
2. i = inf - 1;
3. j = sup;
4. cont = 1;
// Clasificamos la sublista
7. while (cont)
8. while (lista[++i] < elem_div);
9. while (lista[--j] > elem_div);
10. if (i < j)
11. temp = lista[i];
12. lista[i] = lista[j];
13. lista[j] = temp;
4
`
14. else
15. cont = 0;
// Aplicamos el procedimiento
// recursivamente a cada sublista
19. OrdRap (lista, inf, i - 1);
20. OrdRap (lista, i + 1, sup);
5
`
Optimizando.
Slo voy a mencionar algunas optimizaciones que pueden mejorar bastante el
rendimiento de quicksort:
Hacer una versin iterativa: Para ello se utiliza una pila en que se van
guardando los lmites superior e inferior de cada sub-lista.
No clasificar todas las sub-listas: Cuando el largo de las sub-listas va
disminuyendo, el proceso se va encareciendo. Para solucionarlo slo se
clasifican las listas que tengan un largo menor que n. Al terminar la
clasificacin se llama a otro algoritmo de ordenamiento que termine la labor.
El indicado es uno que se comporte bien con listas casi ordenadas, como el
ordenamiento por insercin por ejemplo. La eleccin de n depende de varios
factores, pero un valor entre 10 y 25 es adecuado.
Eleccin del elemento de divisin: Se elige desde un conjunto de tres
elementos: lista[inferior], lista[mitad] y lista[superior]. El elemento elegido es el
que tenga el valor medio segn el criterio de comparacin. Esto evita el
comportamiento degenerado cuando la lista est prcticamente ordenada.
6
`
7
`
Despus de dividir la secuencia, quicksort trata a las dos partes de forma recursiva
mediante el mismo procedimiento. La recursin termina cuando una parte se compone de
un nico elemento.
Ahora se analizara el caso, cuando el pivote result ser el menor elemento de la matriz,
de modo que tuvimos k = 1 y n - k = n - 1. En tal caso, tenemos:
8
`
El mejor de los casos sucede cuando se divide el pivote que escogemos divide el arreglo
en dos partes iguales en cada paso As pues, tenemos k = n / 2 y n-k = n / 2 de la matriz
original de tamao n.
T(n) = 2T(n/2) + n
= 2(2T(n/4) + n/2) + n
= 22T(n/4) + 2 n (simplificando y agrupando trminos semejantes).
= 22(2T(n/8) + n/4) + 2 n
= 23T(n/8) + 3 n
= 2kT(n/2k) + k n (continuando hasta el paso k- esimo)
Debemos tener en cuenta que esta recurrencia se mantendr slo hasta que n = 2^k (de
lo contrario tenemos n/2^k <1), es decir,
hasta k = log n. As, al poner k = log n, tenemos la siguiente ecuacin
9
`
Implementacin en Java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/*
* Principal.java
*
* Created on Oct 4, 2010, 7:25:38 PM
*/
package jahir;
import java.util.Random;
import javax.swing.*;
/**
*
* @author darkgayOn
*/
public class Principal extends javax.swing.JFrame {
public Principal() {
initComponents();
this.setSize(500, 250);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
10
`
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
b1.setSelected(true);
b1.setText("10");
jPanel1.add(b1);
b2.setText("100");
jPanel1.add(b2);
b3.setText("1000");
jPanel1.add(b3);
jButton1.setText("Iniciar");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
jPanel1.add(jButton1);
getContentPane().add(jPanel1, java.awt.BorderLayout.PAGE_START);
jPanel2.setLayout(new java.awt.GridLayout());
s1.setColumns(20);
s1.setRows(5);
jScrollPane1.setViewportView(s1);
jPanel2.add(jScrollPane1);
s2.setColumns(20);
s2.setRows(5);
jScrollPane2.setViewportView(s2);
jPanel2.add(jScrollPane2);
getContentPane().add(jPanel2, java.awt.BorderLayout.CENTER);
11
`
pack();
}// </editor-fold>//GEN-END:initComponents
int n = 0;
if(b1.isSelected())
n = 10;
else if(b2.isSelected())
n = 100;
else
n = 1000;
this.p(s1);
double t1 = System.nanoTime();
ordenarQuicksort(this.vec,0,this.vec.length-1);
double t2 = System.nanoTime();
this.p(s2);
JOptionPane.showMessageDialog(this, "Se demoro: " + (t2-t1) + " Nano segundos");
}//GEN-LAST:event_jButton1ActionPerformed
do{
while(vector[i]<pivote) i++;
while(vector[j]>pivote) j--;
if (i<=j){
auxiliar=vector[j];
vector[j]=vector[i];
vector[i]=auxiliar;
i++;
j--;
}
12
`
} while (i<=j);
13
`
CONCLUSIONES
1200000
1000000
timpo (nano seg)
800000
600000
Series1
400000
200000
0
-200 0 200 400 600 800 1000 1200
-200000
tama;o del vector
14
`
Bibliografa
http://www.iti.fh-flensburg.de/lang/algorithmen/sortieren/quick/quicken.htm
http://www.conclase.net/c/orden/?cap=quicksort
http://es.wikipedia.org/wiki/Quicksort
H.M. Deitel, P.J. Deitel: "Cmo programar en C/C++". Editorial Prentice Hall.
Charles Bowman: "Algoritmos y estructuras de datos: Aproximacin en C".
15