堆排序算法-Java实现

堆排序算法采用递归实现:

首先实现维护最大堆的性质的方法,即假设子节点均已经为最大堆,那么父节点上的值只需要和子节点比较,不断下沉,即可又成为最大堆。

	public static void MaxHeapMaintance(int[] arr,int node,int length){
		if(node<1){
			return;
		}
		int leftNode=2*node;
		int rightNode=2*node+1;
		int maxNode=node;
		int switchValue;
		if(leftNode<=length&&arr[leftNode-1]>arr[node-1]){
			maxNode=leftNode;
		}
		if(rightNode<=length&&arr[rightNode-1]>arr[maxNode-1]){
			maxNode=rightNode;
		}
		if(maxNode!=node){
			switchValue=arr[maxNode-1];
			arr[maxNode-1]=arr[node-1];
			arr[node-1]=switchValue;
			MaxHeapMaintance(arr, maxNode,length);
		}
		
	}

根据维护最大堆属性的方法,可以通过循环构造最大堆,这里需要明白arr.length/2为二叉树的最后一个父节点:

	public static void BuildMaxHeap(int[] arr){
		for(int i=arr.length/2;i>0;i--){
			MaxHeapMaintance(arr, i,arr.length);
		}
	}

最后,将第一个和最后一个元素交换,并持续维护最大堆性质即可排序:

	public static void heapSort(int[] arr){
		int switchValue;
		BuildMaxHeap(arr);
		for(int i=arr.length;i>1;i--){
			switchValue=arr[i-1];
			arr[i-1]=arr[0];
			arr[0]=switchValue;
			MaxHeapMaintance(arr, 1,i-1);
		}
	}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值