`
heisedeyueya
  • 浏览: 96610 次
  • 性别: 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] + " ");
		}
	}
}

分享到:
评论

相关推荐

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

    第一种算法是数组递推,北航某年考研题,算法很好. 第二种算法用栈来消除递归,算法麻烦,但有助于理解递归栈的工作原理

    阿克曼函数递归算法

    阿。克。曼。函。数。递。归。算。法。的。实。现 。

    C++数据结构知识点与经典算法整理

    1、二叉树三种遍历的非递归算法 16 1.先序遍非递归算法 16 2.中序遍历非递归算法 17 3.后序遍历非递归算法 18 4.层次遍历算法 19 2、线性表 20 4、串 23 5、多维数组和广义表 24 6、树与二叉树 24 7、图 26 8、查找...

    算法设计与分析PPT(C语言完整版)

    2.2.1非递归算法分析 2.2.2递归算法分析 2.2.3提高算法质量 第二篇基础篇 第3章算法基本工具和优化技巧3.1循环与递归 3.1.1循环设计要点 3.1.2递归设计要点 3.1.3循环与递归的比较 3.2算法与数据结构 3.2.1原始信息...

    经典数据结构算法c语言实现代码(大全)

    数组递归退出.txt 数组递归退出2.txt 文件加密.txt 文件复制.txt 文件连接.txt 无向图.txt 时间陷阱.txt 杨辉三角形.txt 栈单元加.txt 栈操作.txt 桃子猴.txt 桶排序.txt 检出错误.txt 检测鼠标.txt ...

    史上最全经典数据结构算法c语言实现代码合集

    数组递归退出2.txt 文件加密.txt 文件复制.txt 文件连接.txt 无向图.txt 时间陷阱.txt 杨辉三角形.txt 栈单元加.txt 栈操作.txt 桃子猴.txt 桶排序.txt 检出错误.txt 检测鼠标.txt 汉字字模.txt 汉诺...

    数据结构与算法综合资料库

    实用算法(基础算法 递推法) 数据结构:哈夫曼树的应用 数据结构学习(C++)——递归 双向链表 水波算法实例 算法 平摊分析 算法表达中的抽象机制 随机数算法 台阶问题 通用冒泡排序 图遍历应用 图象扭曲算法 图象...

    pascal基础教程(完整版)

    第一节 递推与递归算法 73 第二节 回溯算法 80 第七章 数据结构及其应用 86 第一节 线性表 86 第二节 队列 90 第三节 栈 93 第四节 数组 97 第八章 搜索 100 第一节 深度优先搜索 100 第二节 广度优先搜索 ...

    数据结构与算法综合资料库.CHM

    实用算法(基础算法 递推法) 数据结构:哈夫曼树的应用 数据结构学习(C++)——递归 双向链表 水波算法实例 算法 平摊分析 算法表达中的抽象机制 随机数算法 台阶问题 通用冒泡排序 图遍历应用 图象扭曲算法 图象...

    Pascal 教程(pdf完整版)

    第一节 递推与递归算法 73 第二节 回溯算法 80 第七章 数据结构及其应用 86 第一节 线性表 86 第二节 队列 90 第三节 栈 93 第四节 数组 97 第八章 搜索 100 第一节 深度优先搜索 100 第二节 广度优先搜索 ...

    PASCAL基础教程

    第一节 递推与递归算法 73 第二节 回溯算法 80 第七章 数据结构及其应用 86 第一节 线性表 86 第二节 队列 90 第三节 栈 93 第四节 数组 97 第八章 搜索 100 第一节 深度优先搜索 100 第二节 广度优先搜索 ...

    C/C++常用算法手册.秦姣华(有详细书签).rar

    3.4.1 递归算法基本思想 90 3.4.2 递归算法示例 90 3.5 分治算法思想 92 3.5.1 分治算法基本思想 92 3.5.2 分治算法示例 92 3.6 概率算法思想 96 3.6.1 概率算法基本思想 96 3.6.2 概率算法示例 97 3.7 小...

    Mie光散射理论的数值计算方法

    :Mie散射级数的计算速度和...该算法在Matlab中实现时,数据以数组的数据类型存储和调用,程序采用递归算法。通过比较计算结果发现,该算法耗时短且结果不易溢出,具有速、稳定、不受颗粒直径和折射率范围影响等优点。

    数据结构及算法编程(阿蒙工作室)

    ☆ 实用算法(基础算法 递推法) ☆ 数据结构 教程 ☆ 数据结构:哈夫曼树的应用 ☆ 数据结构学习(C++)——递归 ☆ 双向链表 ☆ 水波算法实例 ☆ 算法 平摊分析 ☆ 算法表达中的抽象机制 ☆ 算法综合知识 ☆ 随机数...

    数据结构及算法C语言实现代码集[推荐下载]

    数组递归退出2.c 数组递归退出.c ./数学问题/圆周率&#58; 圆周率.c 狐狸圆周率.cpp ./数学问题/小明买书&#58; 小明买书.c 小明买书.cpp ./数学问题/数学算法&#58; 余弦曲线.c 余弦直线.c 符号图形.c 绘制圆.c ./...

    数据结构与算法视频总结-4

    1.3 递推算法 1.4 枚举(穷举)算法 1.5 递归算法 1.6 分治算法 1.7 贪婪算法 1.8 试探法算法 1.9 模拟算法 4.1 排序概述 4.2 冒泡排序法 4.3 快速排序法 4.4 简单选择排序法 4.5 堆排序法 4.6 直接插入排序法 4.7 ...

    数据结构算法

    分治思想 算法洗脑系列(8篇)——第四篇 枚举思想 算法洗脑系列(8篇)——第三篇 贪心思想 算法洗脑系列(8篇)——第二篇 递归思想 算法洗脑系列(8篇)——第一篇 递推思想 天籁数学(3)天籁数学——数列篇(3) ...

    《C算法》((美国)Robert Sedgewick)清晰版[DJVU] 第一卷

    5.1 递归算法 136 练习 141 5.2 分治 142 练习 155 5.3 动态规划 156 练习 160 5.4 树 163 练习 168 5.5 二叉树的数学性质 169 练习 171 5.6 树遍历 172 练习 175 5.7 递归二叉树算法 177 练习 181 5.8 图遍历 182 ...

    《C算法》((美国)Robert Sedgewick)清晰版[DJVU] 第二卷

    5.1 递归算法 136 练习 141 5.2 分治 142 练习 155 5.3 动态规划 156 练习 160 5.4 树 163 练习 168 5.5 二叉树的数学性质 169 练习 171 5.6 树遍历 172 练习 175 5.7 递归二叉树算法 177 练习 181 5.8 图遍历 182 ...

Global site tag (gtag.js) - Google Analytics