Advertisement
tahg

Untitled

Jul 23rd, 2011
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.71 KB | None | 0 0
  1. public class LongHeap {
  2. long elements[] = new long[1];
  3.  
  4. private void swap(int i, int j) {
  5. long temp = elements[i];
  6. elements[i] = elements[j];
  7. elements[j] = temp;
  8. }
  9. public synchronized int insert(long value) {
  10. elements[0]++;
  11. if(elements[0] == elements.length) {
  12. long tempElements[] = new long[elements.length * 2];
  13. System.arraycopy(elements, 0, tempElements, 0, elements.length);
  14. elements = tempElements;
  15. }
  16. elements[(int) elements[0]] = value;
  17. return bubbleUp();
  18. }
  19.  
  20. private int bubbleUp() {
  21. int index = (int) elements[0], parent;
  22. while (index > 1) {
  23. parent = index >> 1;
  24. if(elements[index] < elements[parent]) {
  25. swap(index, parent);
  26. index = parent;
  27. }
  28. else break; // if we don't swap, we're done
  29. }
  30. return index;
  31. }
  32.  
  33. public long peekHead() {
  34. return elements[1];
  35. }
  36.  
  37. public long popHead() {
  38. long value = peekHead();
  39. removeHead();
  40. return value;
  41. }
  42.  
  43. public synchronized void removeHead() {
  44. remove(1);
  45. }
  46.  
  47. public synchronized void remove(int index) {
  48. if(index < 1 || index > elements[0]) return;
  49. if(elements[0]-- != index) {
  50. swap(index, (int) (elements[0] + 1));
  51. bubbleDown(index);
  52. }
  53. }
  54.  
  55. private void bubbleDown(int index) {
  56. int count = (int) elements[0];
  57. while(true) {
  58. int left = index << 1;
  59. if (left == count) { // left child is last element
  60. if(elements[left] < elements[index]) swap(index, left); // if child is smaller, swap
  61. return; // we have no more children so stop
  62. }
  63. else if (left < count) { // we have at least a right child
  64. int minChild = elements[left] < elements[left + 1] ? left : left + 1; // find minimum child
  65. if(elements[minChild] < elements[index]) { // and find minumum compared to parent
  66. swap(index, minChild);
  67. index = minChild;
  68. }
  69. else break; // we're finished if we didn't need to swap
  70. }
  71. else break;
  72. }
  73. }
  74.  
  75. public boolean isEmpty() {
  76. return elements[0] == 0;
  77. }
  78.  
  79. public static void main(String args[]) {
  80. LongHeap heap = new LongHeap();
  81. for(int i = 0; i < 100; i++) {
  82. heap.insert(Double.doubleToLongBits(Math.random()));
  83. }
  84. while (!heap.isEmpty()) {
  85. System.out.print(heap.popHead() + " ");
  86. }
  87. }
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement