八大排序之堆排序

 从下往上进行构建。大顶堆从上往下看,上面大下面小,排好序后将顶部最大值和最后面的值互换,互换后将下面最大值暂时屏蔽,其余元素按大顶堆排序,然后再交换,再排序,最终效果如下:(参考网站https://www.cnblogs.com/chengxiao/p/6129630.html)

 java代码实现:

import java.util.Arrays;

public class duiSort {
	public static void main(String[] args) {
		int[] arr = {16,5,1,0,7,9,4,2};
		for(int p = arr.length-1;p>=0;p--) {
		adjestHeap(arr,p,arr.length);
		}
	
	//堆顶元素和堆底元素互换,维护大顶堆
	for(int i =arr.length-1;i>0;i--) {
		int temp=arr[i];
		arr[i]=arr[0];
		arr[0] = temp;
		//维护大顶堆
		adjestHeap(arr,0,i);
	}
	System.out.println(Arrays.toString(arr));
}	
			
	public static void adjestHeap(int[] arr,int parent,int length) {
		//temp代表父节点的值,将父节点的值取出
		int temp = arr[parent];
		
		//左孩子
		int lChild = 2*parent+1;
                //构建和维护的代码都在这
		while(lChild<length) {
			int rChild = lChild+1;    //右孩子
                        //判断要有右孩子并且找到左右孩子里面大的并进行指向

			if(rChild<length && arr[lChild]<arr[rChild]) {
				lChild++;
			}
			//如果父节点的值大于孩子节点的值,方法结束
			if(temp>=arr[lChild]) {
				break;
			}
                        //将孩子节点的值赋给父亲节点位置
			arr[parent] = arr[lChild];
			parent = lChild;
			lChild = 2 * lChild+1;
		}
		arr[parent] = temp;
		
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值