八大排序-堆排序

堆:大顶堆:在完全二叉树的基础上,每个节点的值都大于或等于他的左右孩子
小顶堆:在完全二叉树的基础上,每个节点的值都小于或等于他的左右孩子

步骤:
1.定义一个游标p,然后从后向前遍历
2.找到p的左右孩子当中的最大值,和p的值进行对比,如果父节点的值大,不需要互换位
置,如果小,则互换位置
3.将最大值放入堆顶,然后进行维护,p指向堆顶,然后c指向p的孩子当中的最大值进行对比
,然后p指向c,c指向原来c的孩子当中的最大值,然后依次向下对比,直到c指向空
4.之后堆顶元素和堆底元素进行互换,然后触发维护
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码:
import java.util.Arrays;

public class HeapSort {
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;
	
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值