Advertisement
PedroPauloFO

Untitled

Apr 12th, 2016
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.58 KB | None | 0 0
  1. package adt.heap;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.List;
  6.  
  7. public class MinHeapImpl<T extends Comparable<T>> implements MinHeap<T> {
  8.  
  9.     private static final int INITIAL_SIZE = 20;
  10.     private static final int INCREASING_FACTOR = 10;
  11.    
  12.     T[] heap = (T[]) new Comparable[INITIAL_SIZE];
  13.     int size = 0;
  14.    
  15.     public boolean isEmpty() {
  16.         return size == 0;
  17.     }
  18.  
  19.     @Override
  20.     public void insert(T element) {
  21.         if (size >= heap.length) { //Heap cheia, aumentamos a capacidade
  22.             heap = Arrays.copyOf(heap, heap.length + INCREASING_FACTOR);
  23.         }
  24.         else if (isEmpty()) {
  25.             heap[0] = element;
  26.             size++;
  27.             return;
  28.         }
  29.  
  30.         int aux = size;
  31.         while (aux > 0 && heap[parent(aux)].compareTo(element) > 0) {
  32.             heap[aux] = heap[parent(aux)];
  33.             aux = parent(aux);
  34.         }
  35.        
  36.         heap[aux] = element;
  37.         size++;
  38.     }
  39.  
  40.     @Override
  41.     public T extractRootElement() {
  42.         if (size < 1){
  43.             return null; //Vazia
  44.         }
  45.         T min = rootElement();
  46.         Util.swap(heap, 0, size-1);
  47.         size--;
  48.         minHeapify(0);
  49.         return min;
  50.     }
  51.  
  52.     @Override
  53.     public T rootElement() {
  54.         if (!isEmpty()) {
  55.             return heap[0]; //Raiz da heap
  56.         }
  57.         return null;
  58.     }
  59.  
  60.     @Override
  61.     public T[] heapsort(T[] array) {
  62.         List<T> result = new ArrayList<T>();
  63.         buildHeap(array);
  64.         while(!isEmpty()){
  65.             result.add(extractRootElement());
  66.         }
  67.         return (T[]) result.toArray(new Comparable[0]);
  68.     }
  69.  
  70.     @Override
  71.     public void buildHeap(T[] array) {
  72.         size = array.length;
  73.         heap = (T[]) new Comparable[array.length];  
  74.    
  75.         for (int i = 0; i < array.length; i++) {
  76.             heap[i] = array[i];
  77.         }
  78.        
  79.         for (int i = ((array.length-1) / 2); i > 0; i--) {
  80.             minHeapify(i);
  81.         }
  82.         minHeapify(0);
  83.     }
  84.    
  85.    
  86.     protected void minHeapify(int index){
  87.         int left = (2*index)+1; // Indice do no da Esquerda
  88.         int right = (2*index)+2; // Indice do no da direita
  89.         int minimum = index; // Topo da heap
  90.        
  91.         if ( (left <= size-1) ) {
  92.             if (heap[left].compareTo(heap[index]) < 0){
  93.                     minimum = left;                                                        
  94.             }else{
  95.                     minimum = index;
  96.             }
  97.         }
  98.        
  99.         if ((right <= size-1)) {
  100.             if (heap[right].compareTo(heap[minimum]) < 0){
  101.                 minimum = right;
  102.             }
  103.         }
  104.        
  105.         if (minimum != index){
  106.             Util.swap(heap, index, minimum);
  107.             minHeapify(minimum);
  108.         }
  109.     }
  110.  
  111.     @Override
  112.     public T[] toArray() {
  113.         T[] result = (T[]) new Comparable[size];
  114.         for(int i = 0; i < result.length; i++){
  115.             result[i] = heap[i];
  116.         }
  117.         return result;
  118.     }
  119.    
  120.     protected int parent(int i) {
  121.         return (i-1)/2;
  122.     }
  123.  
  124.     protected int left(int i) {
  125.         return (2*i) +1;
  126.     }
  127.  
  128.     protected int right(int i) {
  129.         return (2*i) + 2;
  130.     }
  131.  
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement