Ordenar algoritmo Heap de análisis

heapsort

Pila de clasificación es un tipo de algoritmo de ordenación utiliza el montón de características diseñadas. (Árbol binario completo, el valor de cada nodo son nodos hijos mayor que aproximadamente (o menor que))

 

proceso de pila de clasificación puede ser más o menos divide en dos etapas: la acumulación y clasificación montón.

 

montón incorporado

Podemos construir un lugar matriz montón. Es decir, sin la ayuda de in situ con la otra matriz, que operan en la matriz original de montón de edificio

Hay dos métodos: si la matriz original tiene n de datos, se puede suponer contiene inicialmente sólo una matriz de datos, los datos de índice es 1.

A continuación, el índice n es de 2 a los datos insertados secuencialmente en la pila. Tal matriz contendrá n de datos, y organizado en pilas.

Este proceso se construye el procesamiento de datos pila de adelante hacia atrás, lo que es una pila de la parte inferior de la pila proceso de construcción

 

El segundo método y un proceso por el contrario, es un proceso de datos de la parte posterior. Es decir, cuando se inserta cada dato de abajo de la pila de la pila de.

Debido a que el nodo de hoja no puede montón de desde arriba, por lo que a partir de la primera nodo no hoja, a su vez montón de.

 

 

 

secuencia

Después de la construcción de la pila, el primer elemento de la matriz es la parte superior del montón, que es el elemento más grande.

Será con el último cambio de elemento, el elemento más grande que pondría a las posiciones subíndice n.

Ordenar similar a la "Remove parte superior de los elementos de la pila", el subíndice n del elemento en la parte superior de la pila, y luego a través de la pila de la manera, los elementos restantes de la N-1 pilas reconstruidas.

Después de que la pila está completa, entonces tomamos la parte superior de la pila de elementos en un índice de posición es n-1 ,.

Este proceso se repite hasta que el último montón único elemento 1 marcado, el tipo de trabajo está completa.

 

 

 

 

proceso de pila de clasificación

Eficiencia pila de clasificación

montón incorporado

Pila de nodos hoja no es necesario, es necesario partir de la pila del nodo capa penúltima.

Cada nodo de la pila de proceso, el número de nodos necesidad de comparar e intercambio, con una altura proporcional a este nodo k.

 

Cada no hoja suma altura nodo, es la siguiente fórmula:

dislocación de la resta

La fórmula de la izquierda y la derecha se multiplican por 2, obtenemos otra fórmula S2. Alinearemos desalineado S2, con S1 y S2 se resta, S. obtuvo

 

Y S es parte de una secuencia geométrica, sumando secuencia geométrica

Desde h = log2 n, en la fórmula S, puede obtenerse S = O (n), por lo tanto, la complejidad de tiempo de la construcción de pila es O (n). 

 

secuencia

proceso de clasificación es similar a la "parte superior de eliminación del elemento de pila", por lo que la complejidad de tiempo del proceso de clasificación es O (nlogn)

 

Ordenar y construcción pila comprende dos operación de clasificación, la pila de la construcción de tiempo de proceso es la complejidad de tiempo de O (n), la complejidad del proceso de clasificación es O (nlogn).

Por lo tanto, toda la complejidad de tiempo pila de clasificación es O (nlogn).

 

el consumo de espacio de pila de clasificación

Pila de clasificación, ya sea construida o pila de clasificación, que se realiza en la matriz original, sólo se necesitan muy pocos espacio de almacenamiento temporal, por lo que el lugar es pila de clasificación algoritmo de ordenación.

 

Pila de clasificación de la estabilidad

Pila de clasificación no es un algoritmo de ordenación estable.

Debido a que el proceso de clasificación, la presencia del último nodo de la parte superior de pila de la pila con el intercambiables nodo operativo, se hace posible cambiar el valor de los datos originales del mismo orden relativo.

 

Montón Ordenar la ejecución de código


public class Heap {
  private int[] a; // 数组,从下标1开始存储数据
  private int n;  // 堆可以存储的最大数据个数
  private int count; // 堆中已经存储的数据个数
 
  public Heap(int capacity) {
    a = new int[capacity + 1];
    n = capacity;
    count = 0;
  }
  //对于完全二叉树来说,下标从 2n​+1 到 n 的节点都是叶子节点。叶子结点不需要堆化
  private static void buildHeap(int[] a, int n) {
    for (int i = n/2; i >= 1; --i) {
      heapify(a, n, i);
    }
  }

  private static void heapify(int[] a, int n, int i) {
    while (true) {
      int maxPos = i;
      if (i*2 <= n && a[i] < a[i*2]) maxPos = i*2;
      if (i*2+1 <= n && a[maxPos] < a[i*2+1]) maxPos = i*2+1;
      if (maxPos == i) break;
      swap(a, i, maxPos);
      i = maxPos;
    }
  }  
  // n表示数据的个数,数组a中的数据从下标1到n的位置。
  public static void sort(int[] a, int n) {
    buildHeap(a, n);
    int k = n;
    while (k > 1) {
      swap(a, 1, k);
      --k;
      heapify(a, k, 1);
    }
  }
}

 

El código anterior se asume de la pila de datos de matriz subíndice 1 se almacena como la posición de inicio.

Si eso comienza a 0 el almacenamiento, el procesamiento idea es en realidad ningún cambio.

El único cambio cuando se implementa el código, bajo la fórmula para calcular el niño de destino y nodos padre se cambiado.

Si el nodo es el subíndice i, el índice de nodo hijo izquierdo que es 2 * i + 1, el subíndice del niño derecha es 2 * i + 2, el subíndice es el nodo padre (i-1) / 2.

Publicados 113 artículos originales · ganado elogios 25 · Vistas a 30000 +

Supongo que te gusta

Origin blog.csdn.net/qq_42006733/article/details/104694805
Recomendado
Clasificación