Implement the HeapSort using a Min-Heap(堆排序) Java

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;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值