1.Implement the HeapSort using a Min-Heap.
2.Design a heap to maintain the largest 5 numbers given an unlimited data flow.
package homework3;
import java.util.Arrays;
public class MainTest {
public static void main(String[] args)
{
double[] a = new double[10];
for(int i = 0 ; i < 10 ; i++)
a[i] = (double) (Math.random() * 100);
System.out.println(Arrays.toString(a));
MinHeap mh = new MinHeap(a);
mh.Heapsort();
System.out.println(Arrays.toString(a));
//第一题
double[] b = new double[10];
for(int i = 0 ; i < 5 ; i++)
b[i] = (double) (Math.random() * 100);
for(int i = 5 ; i < 10 ; i++)
b[i] = (double) (Math.random() * 1000);
System.out.println(Arrays.toString(b));
double[] d = new double[5];
MinHeap c = new MinHeap(d);
for(int i = 0 ; i < 10 ; i++)
c.add(b[i]);
System.out.println(Arrays.toString(d));
//第二题
}
}
class MinHeap
{
private double[] data;
private int size;
public MinHeap(double[] data)
{
this.data = data;
size = data.length;
}
public MinHeap(int n)
{
data = new double[n];
size = 0;
}
void add(double x)
{
if(size < data.length)
{
minHeapInsert(x);
minHeapify(0);
}else {
if(x > data[0])
{
data[0] = x;
minHeapify(0);
}
}
}
void minHeapInsert(double x) {
size++;
data[size - 1] = Double.POSITIVE_INFINITY;
MinHeapDecrease(x);
}
void MinHeapDecrease(double x) {
for(int i = 0 ; i < size ; i++)
{
if(x > data[i] && x < data[i+1])
data[i] = x;
for(;i>1 && data[i/2]>data[i];)
swap(i, i/2);
}
}
void Heapsort()
{
buildMinHeap();
for(int j = size ; j > 1 ; j--)
{
swap(size-1,0);
size--;
minHeapify(0);
}
}
void buildMinHeap()
{
for(int i = size/2 ; i >= 0 ; i--)
minHeapify(i);
}
void minHeapify(int i)
{
int LEFT = 2 * i + 1;
int RIGHT = 2 * i + 2 ;
int smallest = i;
if(LEFT < size && data[LEFT] < data[i])
smallest = LEFT;
if(RIGHT < size && data[RIGHT] < data[smallest])
smallest = RIGHT;
if( smallest != i )
{
swap( i , smallest );
minHeapify(smallest);
}
}
void swap(int a, int b) {
double temp = data[a];
data[a] = data[b];
data[b] = temp;
}
}