Advertisement
Guest User

Untitled

a guest
Mar 8th, 2015
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.43 KB | None | 0 0
  1. class Heap[Item <% Ordered[Item] : Manifest](maxSize: Int, less: (Item,Item) => Boolean) {
  2.  
  3.   var size: Int = 0
  4.  
  5.   val arr = new Array[Item](maxSize)
  6.  
  7.   def insert(newItem: Item): Unit = {
  8.     arr(size) = newItem
  9.     fixInsertion(size)
  10.     size += 1
  11.     //println(arr.dropRight(arr.length - size).mkString(","))
  12.   }
  13.  
  14.   def += (newItem: Item): Unit = {
  15.     insert(newItem)
  16.   }
  17.  
  18.  
  19.   def top(remove: Boolean = true): Item =  {
  20.     if(!remove)
  21.       return arr(0)
  22.     swap(0, size-1)
  23.     size -= 1
  24.     fixRemoval(0)
  25.     //println(arr.dropRight(arr.length - size).mkString(","))
  26.     arr(size)
  27.   }
  28.  
  29.   def remove(item: Item, i: Int = 0): Unit = {
  30.     if (i < size)
  31.       if (arr(i).equals(item)) {
  32.         size -= 1
  33.         swap(i, size)
  34.         fixRemoval(i)
  35.       }
  36.       else
  37.         remove(item, i+1)
  38.      
  39.   }
  40.  
  41.   def isEmpty: Boolean =  {
  42.     size == 0
  43.   }
  44.  
  45.   private def fixInsertion(i: Int): Unit = {
  46.     if (i > 0 && less(arr(i),arr(i/2))) {
  47.       swap(i, i/2)
  48.       fixInsertion(i/2)
  49.     }
  50.   }
  51.  
  52.   private def fixRemoval(i: Int): Unit = {
  53.     val j = i+1
  54.     if (j * 2 <= size) {
  55.         val next = if (j*2 < size) { if (less(arr(j*2-1), arr(j*2))) j*2-1 else j*2} else j*2-1
  56.         if (less(arr(next), arr(i))) {
  57.             swap(i, next)
  58.             fixRemoval(next)
  59.         }
  60.     }
  61.   }
  62.  
  63.   private def swap(a: Int, b: Int): Unit = {
  64.      val swap = arr(b)
  65.     arr(b) = arr(a)
  66.     arr(a) = swap
  67.   }
  68.  
  69.  
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement