转自
http://topic.csdn.net/u/20110518/09/6021fd63-3084-4fda-a4b6-da2fe58de367.html?seed=1655503227&r=73523235#r_73523235
对原贴的代码进行整理并做一些修改
import java.util.Comparator;
/**
* 将堆调整成最大堆
*
* @author Administrator
*
*/
public class Heap {
/**
* 返回值为i/2
* @param i
* @return
*/
public static int parent(int i) {
return (i - 1) >> 1;
}
/**
* 返回值为2*i
* @param i
* @return
*/
public static int left(int i) {
return ((i + 1) << 1) - 1;
}
/**
* 返回值为2*i+1
* @param i
* @return
*/
public static int right(int i) {
return (i + 1) << 1;
}
public static <T> void heapify(T[] a, int i, Comparator<? super T> c) {
heapify(a, i, c, a.length);
}
public static <T> void heapify(T[] a, int i, Comparator<? super T> c, int size) {
int l = left(i);
int r = right(i);
int next = i;
if (l < size && c.compare(a[l], a[i]) > 0)
next = l;
if (r < size && c.compare(a[r], a[next]) > 0)
next = r;
if (i == next)
return;
swap(a, i, next);
heapify(a, next, c, size);
}
/**
* 对堆进行排序
* @param <T>
* @param a
* @param c
*/
public static <T> void heapSort(T[] a, Comparator<? super T> c) {
buildHeap(a, c);
for (int i = a.length - 1; i > 0; i--) {
swap(a, 0, i);
heapify(a, 0, c, i);
}
}
/**
* 交换数组值
* @param arr
* @param i
* @param j
*/
private static void swap(Object[] arr, int i, int j) {
Object tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
/**
* 创建堆
* @param <T>
* @param a
* @param c
*/
public static <T> void buildHeap(T[] a, Comparator<? super T> c) {
for (int i = (a.length ) / 2 - 1; i >= 0; i--) {
heapify(a, i, c);
}
}
/**
* @param args
*/
public static void main(String[] args) {
// heapify test
Integer[] temp = null;
temp = new Integer[] { 5, 2, 4, 6, 1, 3, 2, 6 };
temp = new Integer[] { 16, 14, 8, 7, 9, 3, 2, 4,1 };
Comparator<Integer> comp = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
};
buildHeap(temp, comp);
for (int i : temp) {
System.out.print(i + " ");
}
System.out.println();
heapSort(temp, comp);
for (int i : temp) {
System.out.print(i + " ");
}
System.out.println();
}
}
分享到:
相关推荐
Java 算法导论 电子书Java 算法导论 电子书Java 算法导论 电子书
博文链接:https://lifethinker.iteye.com/blog/248092
算法导论
算法导论:概述基本算法!对一个编程人员来说,算法很重要,一个好的算法,可以让你的软件运行效果好
NULL 博文链接:https://qianjigui.iteye.com/blog/286520
算法导论C++实现代码.rar 算法导论Java代码.rar 算法导论习题乱解.pdf 算法导论教师参考.pdf 算法导论第二版习题答案_Philip Bille.pdf 算法导论讲义.zip 算法导论第二版大部分算法的Java实现.zip
包括源码:常用排序算法(插入、堆、归并、快速)、装配线问题、最长公共子序列问题、矩阵连乘问题、 优先队列、huffman编码、贪心算法,全部用Java实现的。 算法导论答案
此书的算法部分也很精到 比算法导论更容易学习和入门 Sartaj Sahni《数据结构算法与应用 C++语言描述》全集 包含中英文图书 代码 习题答案 演示动画 都是我亲自从此书的官方网站下载并汇总的 绝对权威 算法和数据...
这本是普林斯顿大学计算机java 教材, 网上可以搜索到源代码,结合书本,做下代码验证。作者是Robert Sedgewick, Kevin Wayne
里面包含了很基础的算法知识,相信你能通过其中的内容学到一定的知识!
算法导论实验,有向图,DAG,强连通分量,拓扑排序,负权重图,割点等等
在有关算法的书中,有一些叙述非常严谨,但不够全面;另一些涉及了大量的题材,但又缺乏严谨性。本书将严谨性和全面性融为一体,深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受。全书各章...
36-算法导论.txt 网盘永久链接 为方便算法 学习爱好者而上传
算法导论,学习算法,c++,java等必备资料,英文版给力
算法导论中文版 第2版 带标签 高清pdf 作者是Thomas H.Cormen、Charles E.Leiserson等
市面上能下载的《算法导论》... 如果觉得贵,可以下载《算法导论》全集,包含中英文图书、C++/Java代码、讲义、习题答案等,包含了本资源,而且可以用WinRAR解压,下载地址: http://download.csdn.net/source/3124028 ...
书中的算法以英语加伪代码的形式给出,只要有一点程序设计经验的人都能读懂,并可以用任何计算机语言(如C/C++和Java等)方便地实现。在书中,作者将算法的讨论集中在一些比较现代的例子上,它们来自分子生物学(如...
java实现合并排序、 快速排序,散列表的设计与实现,矩阵链乘的动态规划、贪心算法程序设计。算法设计,有文档有源码,有截图。
书中的算法以英语加伪代码的形式给出,只要有一点程序设计经验的人都能读懂,并可以用任何计算机语言(如C/C++和Java等)方便地实现。在书中,作者将算法的讨论集中在一些比较现代的例子上,它们来自分子生物学(如...
市面上能下载的《算法导论》中文版都没有目录(标签),阅读极不方便,翻阅困难。本人(crocostone)亲自手动制作了完整的标签,包括章、节、小节的标签,在Acrobat 7.0和9.0版本和FoxitReader 4.2版本均能打开。 ...