`
heisedeyueya
  • 浏览: 97735 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

数组堆化的递推和递归算法

阅读更多
package org.iSun.heisedeyueya;

public class Heap {

	public static void main(String args[]) {
		int[] array = new int[] { 24, 10, 90, 77, 16, 25, 33, 89, 67 };
		Heap.miniHeap(array, array.length);
		print(array);
	}

	/**
	 * 构造最小堆
	 * 
	 * @param array
	 * @param n
	 */
	public static void miniHeap(int[] array, int n) {

		int currentPos = (n - 2) >>> 1;// 计算第一个非叶子节点的位置
		while (currentPos >= 0) {// 递推循环直到堆顶位置
			recursionFilterDown(array, currentPos);
			// recurrenceFilterDown(array, currentPos);
			currentPos--;
		}
	}

	/**
	 * 交换
	 * 
	 * @param array
	 * @param i
	 * @param j
	 */
	public static void swap(int[] array, int i, int j) {
		int temp = array[i];
		array[i] = array[j];
		array[j] = temp;
	}

	/**
	 * 递归算法
	 * 
	 * @param array
	 * @param currentPos
	 *            当前的位置作为父亲节点
	 */
	public static void recursionFilterDown(int array[], int currentPos) {
		// 左孩子的位置
		int leftChild = currentPos * 2 + 1;
		// 右孩子的位置
		int rightChild = leftChild + 1;
		// 递归结束
		if (rightChild >= array.length || leftChild >= array.length)
			return;
		// 选择较小的孩子
		int minChild = array[leftChild] > array[rightChild] ? rightChild
				: leftChild;
		// 如果父亲节点的值大于较小的孩子那么交换
		if (array[currentPos] > array[minChild])
			swap(array, currentPos, minChild);
		// 递归调用,将孩子节点作为当前节点
		recursionFilterDown(array, minChild);
	}

	/**
	 * 递推算法
	 * 
	 * @param array
	 * @param currentPos
	 */
	public static void recurrenceFilterDown(int array[], int currentPos) {
		// 左孩子位置
		int child = currentPos * 2 + 1;
		while (child < array.length) {
			if (child + 1 < array.length && array[child + 1] < array[child])
				child++;
			// 已经满足小顶堆,直接跳出循环
			if (array[child] > array[currentPos])
				break;
			else {// 不满足就交换
				swap(array, child, currentPos);
				currentPos = child; // 改变当前节点为孩子节点
				child = 2 * currentPos + 1;// 计算孩子节点的位置
			}
		}
	}

	public static void print(int[] array) {
		for (int i = 0; i < array.length; i++) {
			System.out.print(array[i] + " ");
		}
	}
}

分享到:
评论

相关推荐

    递推与递归应用[参照].pdf

    【递推与递归应用】 递推思想是软件开发中的一种常见解决问题的策略,尤其在算法设计和数据结构中有着广泛的应用。递推关系是一种通过数学模型表达...然而,理解和掌握递推与递归的关系对于提高算法设计能力至关重要。

    用递推关系理论分析递归算法的时间复杂度.doc

    用递推关系理论分析递归算法的时间复杂度 递归算法是算法设计中常用的技术,但对递归算法的时间复杂度分析却是困难的。用组合数学中的递推关系理论可以分析递归算法的时间复杂度。本文提出用递推关系理论分析递归...

    ackerman函数的两种非递归算法及源代码

    本文将深入探讨 Ackerman 函数的两种非递归实现方法:数组递推和栈消除递归,并通过源代码分析它们的工作原理。 1. Ackerman 函数定义: Ackerman 函数通常表示为 A(m, n),其中 m 和 n 是非负整数。它的定义如下:...

    使用分治策略递归和非递归和递推算法解决循环赛日程表课程设计报告.docx

    综上,三种算法在解决循环赛日程表问题时,虽然都能达到正确性,但在效率上递归算法在某些方面可能优于非递归算法,但由于递归的栈空间消耗,非递归算法在处理大规模问题时可能更优。递推算法则介于两者之间,提供了...

    使用分治策略递归和非递归和递推算法解决循环赛日程表课程设计报告.pdf

    递归算法会直接调用自身来处理子问题,而非递归算法则会使用栈或其他数据结构模拟递归过程。 1. **分治策略递归算法**: - 当n=2时,两个运动员之间直接比赛,无需再分。 - 当n&gt;2时,将运动员分为两组,每组n/2...

    第二章分治与递归

    递归算法的执行过程可以分为两个阶段:递推阶段和回归阶段。 - **递推阶段**:在这个阶段,问题会被分解成更小规模的子问题。例如,对于规模为`n`的问题,通过递归调用,我们可以将其简化为规模小于`n`的问题。 - *...

    阿克曼函数递归算法

    阿克曼函数是一种特殊的双参数函数,它以其快速增长的速度而著名,在计算机科学领域内常被用来测试算法的性能极限以及递归算法的实现。阿克曼函数由威廉·阿克曼在1928年定义,其形式为: \[ A(m, n) = \begin{...

    《算法与数据结构》—递推方程及算法分析

    本文将对递推方程的概念、算法设计和时间复杂度分析进行详细的介绍,并通过几个例子来加深对递推方程的理解。 递推方程的概念 递推方程是一种定义数列或序列的数学表达式,每个元素的值都可以用前一个元素或前几个...

    迭代与递归算法

    **递归算法**则是一种自引用的方法,它在一个函数内部调用自身,每次调用都解决一个更小的问题,最终所有子问题的解组合成原问题的解。例如,"递归和迭代的区别.doc"可能阐述了递归如何通过递归公式解决斐波那契序列...

    递推算法递推算法.pdf

    递推算法是一种基于序列中前后项关系解决问题的方法,它通常涉及定义初始条件(边界)和递推关系,然后通过这些规则逐步计算出序列中的任意一项。在给定的资料中,递推算法被应用于各种不同的场景,如求和、计算阶乘...

    C语言算法1-3章 算法,递归算法 模拟算法

    - **定义**:递归算法是一种在函数内部调用自身的算法,它通过不断缩小问题规模来求解复杂问题。 - **示例**:阶乘函数就是一个典型的递归算法应用实例。 #### 1.6 分治算法 - **定义**:分治算法是通过将大问题...

    递归算法.rar

    在计算机科学中,递归算法是一种强大的编程技术,它通过函数或过程调用自身来解决问题。递归的核心在于将复杂的问题分解为多个相似的子问题,直到子问题变得足够简单,可以直接求解。这种思想源自数学中的递推关系,...

    《信息学奥赛一本通》:第3章 递推算法(C++版)

    递推算法与递归算法虽然都是解决特定类型问题的有效方法,但它们之间存在本质区别: - **递推**:通常指的是非数值的递推,侧重于数值计算。递推算法通过一个或多个初始值和一个递推公式来计算后续值。 - **递归**...

    基础算法 第4章 递归算法(C++版)-2020.12.22.pdf

    递归算法包含两部分:递归基和递归步骤。 - **递归基**:指递归算法中能够直接求解的最简单情况。 - **递归步骤**:将复杂问题分解为更简单的子问题,并调用自身解决这些子问题。 #### 三、递归算法示例分析 #####...

    27丨递归树:如何借助树来求解递归算法的时间复杂度?1

    递归树是一种用于分析递归算法时间复杂度的可视化工具,尤其在处理复杂递归关系时,能够简化问题的理解和计算。在递归算法中,我们通常将大问题分解为小问题来解决,这个过程可以抽象成一棵树的结构,即递归树。 ...

    算法时间复杂度分析中递归方程求解方法综述

    对于一个包含`n`个元素的数组,通过递归调用来寻找数组中的最大值和最小值。该递归过程可以用以下递归方程表示: \[ C(n) = \begin{cases} 2 & \text{if } n = 1 \\ C(\frac{n}{2}) + C(\frac{n}{2}) + 2 & \text{...

    贪心算法+递推+各种查找、排序算法

    与递归算法相比,递推算法通常具有更低的时间复杂度和空间复杂度,因为它避免了重复计算和递归调用带来的开销。 ### 排序算法 排序算法是计算机科学中最基本的算法之一,用于将一组数据按照特定的顺序(升序或降序...

Global site tag (gtag.js) - Google Analytics