package test.slicer.small;
/**
* A Heapsort demonstration algorithm HeapAlgorithm.java, 19.04.97
*
* @author Lars Marius Garshol
* @version 1.00 - 19.04.97
*/
class HeapAlgorithm extends SortAlgorithm {
void sort(int a[]) throws Exception {
int i;
// ----Step 1: Make a heap in linear time. Top of heap at top of array.
// Largest numbers at the top
for (i = a.length / 2; i >= 0; i--) {
perc_down(i, a, a.length - 1);
}
// ----Step 2: Take out elements one by one, largest first, and put them
// at the bottom
for (i = a.length - 1; i >= 0; i--) {
delete_max(i, a); // Places max element at a[i]
}
}
void delete_max(int ix, int a[]) throws Exception {
int ret;
ret = a[0]; // Return value
a[0] = a[ix];
perc_down(0, a, ix - 1); // Percolate last value down
a[ix] = ret;
}
// Have to go to i*2+1 and i*2+2 because we start at 0
// lng is the last index we can touch, the end of the heap
void perc_down(int ix, int a[], int lng) throws Exception {
int i, tmp;
tmp = a[ix];
i = ix;
while (i * 2 + 1 <= lng) {
if (i * 2 + 1 == lng || a[i * 2 + 1] > a[i * 2 + 2]) {
if (a[i * 2 + 1] < tmp)
break; // Position found
a[i] = a[i * 2 + 1];
i = i * 2 + 1;
} else {
if (a[i * 2 + 2] < tmp)
break; // Position found
a[i] = a[i * 2 + 2];
i = i * 2 + 2;
}
pause(i, ix);
}
a[i] = tmp;
}
}