堆排序(java)

堆排序(java)

堆排序就是一颗树🌲,每一次的遍历都会把整颗树中值最大的节点送往根节点,然后摘掉这个根节点放入结果数组,再继续,直到树被掏空。
先拆分成一个小问题来看,这颗mini树内部进行对比交换,最后最大的值应该是root节点
请添加图片描述
然后放眼来看整颗树🌲,一轮对比下来,最大的应该在树顶
请添加图片描述
每轮结束后,将树顶的节点投入到结果数组中
请添加图片描述
经过N(N为原数组长度)轮后,树就已经被完全掏空了,结果数组也已经填满了
请添加图片描述

java实现

import java.util.ArrayList;

public class Sort{
		public static ArrayList<Integer> heapsort(ArrayList<Integer> origin){
		ArrayList<Integer> res=new ArrayList<>();
		while(!origin.isEmpty()){//直到树被完全掏空
			if(origin.size()>1){
				origin=nodeswap(origin, 0);
			}
			res.add(origin.get(0));//将树顶投入到结果数组当中
			origin.remove(0);
		}
		return res;
	}
	public static ArrayList<Integer> nodeswap(ArrayList<Integer> origin,int pos){
		int leftpos=pos*2+1;int rightpos=pos*2+2;//左右节点位置坐标
		int maxpos;int mid;
		if(leftpos>=origin.size()){//没有左右节点,不对树做处理
			return origin;
		}else{
			origin=nodeswap(origin, leftpos);
			maxpos=leftpos;//最大值默认左边节点,如果右边大于左边,则为右边
			if(rightpos<origin.size()){
				origin=nodeswap(origin, rightpos);
				if(origin.get(rightpos)>origin.get(leftpos)){
					maxpos=rightpos;
				}
			}
			if (origin.get(maxpos)<origin.get(pos)) {
				maxpos=pos;//如果左右最大的节点都小于根节点,则数组保持不变
			}else{
				//否则需要换位
				mid=origin.get(pos);
				origin.set(pos, origin.get(maxpos));
				origin.set(maxpos, mid);
			}
		}
		return origin;
	}

}

代码测试

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值