El algoritmo heapsort es uno de los algoritmos más rápidos de clasificación disponibles . Los programadores usan heapsort en Java porque es una buena opción para las matrices muy grandes que saben estar en un estado sin clasificar. Por razones de eficacia , no se utiliza una estructura de árbol real. En cambio , el árbol se forma en el lugar, justo en el array. El algoritmo heapsort es un " en el lugar" algoritmo , ya que no requiere más memoria para realizar la ordenación . Instrucciones
1
Componer el método de intercambio. Esto intercambiar dos elementos de una matriz " " public void intercambio estática (int [ ] a, int i , int j ) { int tmp = a [ j ] ; . A [ j ] = a [ i ], a [i ] = tmp ;} " "
2
Escribir el núcleo del algoritmo, el método siftDown . Se utiliza tanto para formar la estructura de pila y hacer el tipo real.
3
Tamizar valores altos hacia la raíz del árbol y valores pequeños hacia las hojas con el método siftDown . Como este método se llama varias veces durante el proceso de clasificación , el nodo más grande se tamiza constantemente al nodo raíz y se trasladó a la final de la matriz . Cualquier nodo n tiene un máximo de dos niños, cuyos índices son n * 2 + 1 y n * 2 + 2 . " " public static void siftDown (int [ ] a, int inicio , int fin) { int root = inicio , mientras que ( root * 2 + 1 niño int = root * 2 + 1 //Si el niño tiene un hermano y de la valor del niño es inferior a su hermano si (el niño menor + + ;} if ( un swap [ root] (a, raíz, hijo) ; root = niño; } else {return ;} } } " "
4 < p > Utilizar el método heapify . Este método se llama al principio de la clase para crear la estructura de montón inicial . Esto se realiza de forma rápida , ya que la estructura de montón es un tanto vaga . el único requisito es que cada nodo raíz debe ser mayor que el nodos hijos " " public static void heapify (int [ ] a) {for (int start = a.length /2 - 1; inicio > = 0 , empieza -) . siftDown (a, comienzo , a.length - 1 ) ;} " "
5
Escribir el método heapsort el método heapifies primero la matriz de prepararse para la clase el método siftDown entonces se llamó de nuevo desde el nodo raíz es ahora un valor pequeño presente . . . tamiza un nuevo valor grande para el nodo raíz , y todo el proceso se repite hasta que el tamaño de la pila es una " " public static void heapSort ( int [ ] a) { heapify ( a) ; . for (int = un extremo . longitud - 1 ; final > 1 ; final -) { swap ( a, final , 0); siftDown (a, 0 , final - 1 ) ;} } " "
6
prueba . el método heapsort el siguiente ejemplo muestra un pequeño programa de prueba " " public static void main ( String [] args ) { int [ ] a = new int [ 10] . for (int i = 0 ; i for (int i = 0 ; i swap ( a, i, i + ( int) ( Math.random () * ( 9 - i)) ) System.out.println ( "Antes de la clasificación :") ; for (int i = 0 ; i heapsort ( a); System.out.println ( " Después de la clasificación "); for (int i = 0 ; } i " "