优先列队(堆)

本文深入探讨了数据结构中的堆结构,包括大顶堆和小顶堆的概念,并通过实例展示了如何使用堆排序算法对数组进行排序。文章提供了详细的Java代码实现,解释了堆排序的工作原理,包括构建初始堆、调整堆以及完成排序的全过程。
摘要由CSDN通过智能技术生成

优先列队(堆)也是一种树结构!!

package 数据结构与算法;

import java.util.Arrays;

// 堆的性质
// 大顶堆:父节点 > 子节点
// 小顶堆:父节点 < 子节点 

// 升序排列大顶堆
// 降序排列小顶堆
// 联想堆排序,快排?
public class 树_堆结构 {
	
	public static void main(String[] args) {
		int[] arr = {9, 6, 8, 7, 0 ,1, 10, 4, 2};
		
		int start = (arr.length-1)/2;
		heapSort(arr);
		System.out.println(Arrays.toString(arr));
	}
	
	public static void heapSort(int[] arr) {
		// 开始位置是最后一个非叶子节点, 即最后一个节点的父节点
		int start = (arr.length -1)/2;
		// 调整为大顶堆
		for (int i = start; i >= 0; i--) minHeap(arr, arr.length, i);
		// 把数组中第0个和堆中最后一个数交换位置, 再把前面的调整为大顶堆
		for (int i = arr.length- 1; i > 0; i--) {
			int  temp = arr[0];
			arr[0] = arr[i];
			arr[i] = temp;
			minHeap(arr, i, 0);
		}
	}
	
	public static void maxHeap(int[] arr, int size, int index) {
		// 左子节点
		int leftNode = 2*index+1;
		
		// 右子节点
		int rightNode = 2*index+2;
		int max = index;
		//和两个节点对比找出最大的节点
		if (leftNode < size && arr[leftNode] > arr[max]) max = leftNode;
		
		if (rightNode < size && arr[rightNode] > arr[max]) max = rightNode;
		
		// 交换位置 swap
		if (max != index) {
			int temp = arr[index];
			arr[index] = arr[max];
			arr[max] = temp;
			// 交换后可能会排好的堆 !注意max
			maxHeap(arr, size, max);
		}
	}
	
	public static void minHeap(int[] arr, int size, int index) {
		// 左子节点
		int leftNode = 2*index+1;
		
		// 右子节点
		int rightNode = 2*index+2;
		int min = index;
		//和两个节点对比找出最大的节点
		if (leftNode < size && arr[leftNode] < arr[min]) min = leftNode;
		
		if (rightNode < size && arr[rightNode] < arr[min]) min = rightNode;
		
		// 交换位置 swap
		if (min != index) {
			int temp = arr[index];
			arr[index] = arr[min];
			arr[min] = temp;
			// 交换后可能会排好的堆 !注意min
			minHeap(arr, size, min);
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值