算法学习记录——二叉堆排序(JAVA实现)

对二叉堆(最大堆)进行排序操作——升序操作 

import java.util.Arrays;

//堆排序(最大堆)实现
//二叉堆实际是存储在一个数组中

public class HeapSort {
	
	//“下沉”操作--->当前下沉是要创建一个最大堆,即父节点(小于子节点)下降,最大的元素(子节点)上升。
	public static void downAdjust(int[] array, int parentIndex, int length) {
		
		int temp=array[parentIndex];//存储当前要进行下沉的父节点
		int childIndex=parentIndex*2+1;//计算当前父节点的左孩子节点
		
		while(childIndex<length) {//判断当前是否还有孩子节点,孩子节点不能大于等于数组的长度
			
			//判断是否有右孩子,且右孩子的值大于左孩子
			if(childIndex+1<length && array[childIndex+1]>array[childIndex]) {
				childIndex++;//孩子指针指向右孩子
			}
			
			//判断父节点是否大于等于当前最大的孩子节点,满足条件直接跳出,终止循环。
			if(temp>=array[childIndex]) {
				break;
			}
			
			
			//将最大的孩子节点移到当前父节点的位置
			array[parentIndex]=array[childIndex];
			//将父节点指针,指向最大的孩子节点指针处,以备最后的赋值操作
			parentIndex=childIndex;
			//计算当前孩子节点的孩子节点(也就是孙子节点),为while循环的终止条件作准备-->改变循环变量的值
			childIndex=childIndex*2+1;
		}
		
		//将原来的父节点,移到变换后的孩子节点处,以实现最终的下沉目的。
		array[parentIndex]=temp;
	}
	
	
	//排序实现
	public static void heapSort(int[] array) {
		
		//将一个无序的数组变成最大堆
		for(int i=(array.length-2)/2; i>=0; i--) {
			downAdjust(array,i,array.length);
		}
		
		System.out.println(Arrays.toString(array));
		
		//排序过程
		for(int i=array.length-1; i>0; i--) {
			//堆顶元素和最后一个叶子元素交换,实际就是数组的第一个元素和当前数组最后一个元素交换。
			int temp=array[0];
			array[0]=array[i];
			array[i]=temp;
			
			//对交换完成的数组进行下沉操作
			downAdjust(array,0,i);
		}
	}
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] array=new int[] {1,3,2,6,5,7,8,9,10,0};
		heapSort(array);
		System.out.println(Arrays.toString(array));
	}

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值