堆排序

堆排序的步骤:

第一步:构建堆

第二步:交换数组的第一个值(构建好大顶堆后,第一个值为数组的最大值)和最后一个值

这个时候数组的最后一个为最大值了,重复上述两个步骤,将数组长度length-1的排序  ,直到length-1  为1的时候停止


public class HeadSort {
	public static void main(String[] args) {
		int[] arr={3,1,2,4,4,9,8};
		dosort(arr);
	    System.out.println(Arrays.toString(arr));
	}
	public static void dosort(int[] arr){
		int length=arr.length;
		while(length>1){
			buildHead(arr,length);
			swapMax(arr,length);
			--length;
		}	
	}
    public static void buildHead(int[] arr,int length){
    	for(int i=(length-2)>>1;i>=0;i--){
    		casChild(arr,i,length);
    	}
    }
    /*
     * 将父节点和子节点比较交换,把最大值放在父节点上
     */
    public static void casChild(int[] arr,int parentindex,int length){
    	int rightindex=-1;
    	int leftindex=parentindex*2+1;
    	int maxchildindex=leftindex;
    	if(length-1>=parentindex*2+2){
    		rightindex=parentindex*2+2;
    		if(arr[rightindex]>arr[rightindex-1]){
    			maxchildindex=rightindex;
    		}
    	}
    	if(arr[parentindex]<arr[maxchildindex]){
    		int temp=arr[parentindex];
    		arr[parentindex]=arr[maxchildindex];
    		arr[maxchildindex]=temp;
    	}
    }
    //将最大值和在最后的值交换
    public static void swapMax(int[] arr,int length){
    	int temp=arr[0];
    	arr[0]=arr[length-1];
    	arr[length-1]=temp;
    	
    }
}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值