堆排序|minHeapFixDown的递归和迭代形式

minHeapFixDown的递归和迭代形式

// 把以i为根节点的二叉堆调整成小顶堆
	public static void minHeapFixDown(int[] arr, int i, int n) {
		// 找到左右孩子
		int left = 2 * i + 1;
		int right = 2 * i + 1;
		// 找到左右孩子中的最小孩子
		// 左孩子越界,右孩子必越界,根节点为叶子节点,此为递归出口
		if (left >= arr.length) {
			return;
		}
		int min = left;
		// 只有左孩子
		if (left == arr.length - 1) {
		} else {
			if (arr[left] > arr[right]) {
				min = right;
			}
		}
		// 如果根节点比左右孩子都要小,不用调整
		// 否则选取左右孩子中最小的节点,与根节点交换
		// 对选取的孩子节点,以其为根节点对二叉堆进行递归调整
		if (arr[i] <= arr[min]) {
			return;
		} else {
			swap(arr, i, min);
			i = min;// 移动根
			minHeapFixDown(arr, i, n);
		}
	}
// 迭代形式的siftDown
	public static void siftDown(int[] arr, int i, int n) {
		int left = 2 * i + 1;
		while (left < n) {
			int right = left + 1;
			int min = left;

			if (right < n && arr[left] > arr[right]) {
				min = right;
			}

			if (arr[i] <= arr[min]) {// 无需调整
				break;
			}
			swap(arr, i, min);
			i = min;
			left = 2 * i + 1;
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值