堆排序

记录下堆排序。。。。

堆排序的步骤:

1)根据给定的数组建立堆结构,维护堆的性质;

2)排序:每次将堆顶与最后一个元素(不算堆顶互换过来的)互换,再维护 第一个元素至最后一个元素 的堆性质,重新维护堆。。。依此循环


import java.util.Arrays;
public class HeapMakeTest {

	public static void main(String[] args) {
		int[] num = {1,2,5,3,9,7,4,8};
		HeapMakeTest hmt = new HeapMakeTest();
		hmt.makeHeap(num,num.length);	
		System.out.println(Arrays.toString(num));
		hmt.heapSort(num, num.length);
		System.out.println(Arrays.toString(num));
	}
	
	// 建立一个大顶堆,从最后一个元素的双亲节点开始
	public void makeHeap(int[] num,int length){
		for(int i=(length-1-1)/2;i>=0;i--)
			adjustHeap(num,i,length);
	}	
	public void adjustHeap(int[] num, int k, int length){
		int temp = num[k];                   // 记录父节点的值
		for(int i=2*k+1;i<length;i=2*i+1){   //  i=2*i+1  不断的往孩子节点方向调整,因为父节点与孩子节点交换后,孩子树中可能不满足堆的性质
			if(i+1<length && num[i]<num[i+1])
				i++;                         // 找到左、右孩子节点中的最大值
			if(temp>=num[i])
				break;						 // 如果父节点大于孩子节点,不需要调整
			else{
				num[k]=num[i];               // 孩子节点赋值给父节点
				k = i;						 // 记录需要更新的节点位置
			}
		}
		num[k]=temp;                         // 更新上述k下标节点的值
	}
	
	// 堆排序
	public void heapSort(int[] num,int length){		
		// 数组首部与数组尾部交换,即堆的顶挪到“相对”最后一位,(不算来自堆顶的元素),再将其余的数组元素重建堆,依此循环
		for(int i=0;i<length;i++){
			int tmp = num[0];
			num[0]=num[length-1-i];
			num[length-1-i]=tmp;		
			makeHeap(num,length-1-i);		
		}		
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值