-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBinaryHeap.java
183 lines (161 loc) · 4.17 KB
/
BinaryHeap.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
// BinaryHeap class
//
// CONSTRUCTION: with optional capacity (that defaults to 100)
// or an array containing initial items
//
// ******************PUBLIC OPERATIONS*********************
// void insert( x ) --> Insert x
// Comparable deleteMin( )--> Return and remove smallest item
// Comparable findMin( ) --> Return smallest item
// boolean isEmpty( ) --> Return true if empty; else false
// void makeEmpty( ) --> Remove all items
// ******************ERRORS********************************
// Throws UnderflowException as appropriate
/**
* Implements a binary heap. Note that all "matching" is based on the compareTo
* method.
*
* @author Mark Allen Weiss
*/
public class BinaryHeap<AnyType extends Comparable<? super AnyType>> {
/**
* Construct the binary heap.
*/
public BinaryHeap() {
this(DEFAULT_CAPACITY);
}
/**
* Construct the binary heap.
*
* @param capacity the capacity of the binary heap.
*/
@SuppressWarnings("unchecked")
public BinaryHeap(int capacity) {
currentSize = 0;
array = (AnyType[]) new Comparable[capacity + 1];
}
/**
* Construct the binary heap given an array of items.
*/
@SuppressWarnings("unchecked")
public BinaryHeap(AnyType[] items) {
currentSize = items.length;
array = (AnyType[]) new Comparable[(currentSize + 2) * 11 / 10];
int i = 1;
for (AnyType item : items)
array[i++] = item;
buildHeap();
}
/**
* Insert into the priority queue, maintaining heap order. Duplicates are
* allowed.
*
* @param x the item to insert.
*/
public void insert(AnyType x) {
if (currentSize == array.length - 1)
enlargeArray(array.length * 2 + 1);
// Percolate up
int hole = ++currentSize;
for (array[0] = x; x.compareTo(array[hole / 2]) < 0; hole /= 2)
array[hole] = array[hole / 2];
array[hole] = x;
}
@SuppressWarnings("unchecked")
private void enlargeArray(int newSize) {
AnyType[] old = array;
array = (AnyType[]) new Comparable[newSize];
for (int i = 0; i < old.length; i++)
array[i] = old[i];
}
/**
* Find the smallest item in the priority queue.
*
* @return the smallest item, or throw an UnderflowException if empty.
*/
public AnyType findMin() {
if (isEmpty())
throw new NullPointerException();
return array[1];
}
/**
* Remove the smallest item from the priority queue.
*
* @return the smallest item, or throw an UnderflowException if empty.
*/
public AnyType deleteMin() {
if (isEmpty())
throw new NullPointerException();
AnyType minItem = findMin();
array[1] = array[currentSize--];
percolateDown(1);
return minItem;
}
/**
* Establish heap order property from an arbitrary arrangement of items. Runs in
* linear time.
*/
private void buildHeap() {
for (int i = currentSize / 2; i > 0; i--)
percolateDown(i);
}
/**
* Test if the priority queue is logically empty.
*
* @return true if empty, false otherwise.
*/
public boolean isEmpty() {
return currentSize == 0;
}
/**
* Make the priority queue logically empty.
*/
public void makeEmpty() {
currentSize = 0;
}
/**
* Finds the size of the Binary Heap
*
* @return size of Binary Heap
*/
public int size() {
return currentSize;
}
private static final int DEFAULT_CAPACITY = 10;
private int currentSize; // Number of elements in heap
private AnyType[] array; // The heap array
/**
* Internal method to percolate down in the heap.
*
* @param hole the index at which the percolate begins.
*/
private void percolateDown(int hole) {
int child;
AnyType tmp = array[hole];
for (; hole * 2 <= currentSize; hole = child) {
child = hole * 2;
if (child != currentSize && array[child + 1].compareTo(array[child]) < 0)
child++;
if (array[child].compareTo(tmp) < 0)
array[hole] = array[child];
else
break;
}
array[hole] = tmp;
}
// Test program
public static void main(String[] args) {
int numItems = 10000;
BinaryHeap<Integer> h = new BinaryHeap<>();
int i = 37;
for (i = 37; i != 0; i = (i + 37) % numItems)
h.insert(i);
for (i = 1; i < numItems; i++)
if (h.deleteMin() != i)
System.out.println("Oops! " + i);
}
public Customer get(int i) {
// TODO Auto-generated method stub
return null;
}
}