Java 堆排序

public class Heap {

	/**
	 * 根据给定的数组以及  数组的取值范围  lastIndex 构造大顶堆; 
	 * 步骤:
	 * 1.从最后一个非叶子节点((lastIndex-1)/2)开始往上遍历所有的非叶子节点((lastIndx-1)/2,.....,0)
	 * 2.对于每一个非叶子节点K
	 * 	 2.1  判断是否含有孩子节点,并找到比K节点值大的最大的孩子节点(bigger),没有则退出
	 * 	 2.2 交换 K 节点 与 bigger 节点的值
	 *   2.3 K节点变为bigger节点,并返回 2.1
	 * */
	public static void buildMaxHeap(int[] data, int lastIndex){
		
		for(int i=(lastIndex-1)/2; i>=0; i--){
			int k=i;
			/**
			 * 	数组的数据[0,1,2,......,lastIndex-1]
			 * */
			while(k*2+1<lastIndex){	//如果当前节点K 节点的的子节点存在存在一个
				int left = 2*k+1;
				int right = 2*k+2;
				int bigger;
				if(right<lastIndex)  //存在右孩子节点
					bigger = data[left] > data[right] ? left:right;
				else				//只存在左孩子节点
					bigger = left;
				if(data[k]>= data[bigger])  //如果两个孩子的值都比父节点的值小,不需要交换,退出
					break;
				else{
					int tep = data[k];
					data[k] = data[bigger];
					data[bigger] = tep;
					k  = bigger;
				}
			}
		}
	}
	/**
	 *  堆排序 给定数组data[]
	 *  int k = data.length
	 *  步骤:
	 *  1.构造大顶堆
	 *  2.输出第一个元素(最大值)
	 *  3.交换第一元素,最后一个元素
	 *  4.构造大顶堆的数组范围减  1 ,返回  1
	 * */
	public static void HeapSort(int[] data){
		int k = data.length;
		int t= k;
		for(int i=0; i<k;i++){
			buildMaxHeap(data,t);
			System.out.print(data[0]+" ");
			int tep = data[0];
			data[0] = data[k-i-1];
			data[k-i-1] = tep;
			t--;
		}
	}
	
	public static void main(String[] args){
		
		int[] data = {34,21,3,4,5,67,89,90,35};
		Heap.HeapSort(data);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值