主程序:
package yangkunlin.algorithm.sort;
import yangkunlin.algorithm.tool.SortTool;
/**
* 堆排序
*
* 前提:堆的根节点的序号是1,并且满足最大堆属性。
* 堆是存放在数组中的,堆的大小要小于数组的大小。
* 注意下边个方法的参数是以1开始记得。
*
* 时间复杂度:O(nlgn)
* 原地排序,不需要多余的空间。
* @author yangkunlin
*
*/
public class HeapSort {
/**
* 最大堆排序算法,将source按最大堆排序算法由小到大排序
* @param source
*/
public void heapSort(int[] source){
bulidMaxHeap(source);
for (int lastElement = source.length -1; lastElement >0; lastElement--) {
SortTool.exchange(source, 0, lastElement);
maxHeapily(source, 1, lastElement);
}
}
/**
* 以第i个元素为根的子树保持最大树,终点为第heapSize个元素。source中第heapSize个元素之后的元素不予理会。
* 即堆的大小为heapSize,从数组第一个元素到第heapSize个元素为止。
* @param source
* @param i 第i个元素,指的是从1开始的。因此后边在取数组元素的时候,都有-1.
* @param heapSize
*/
public void maxHeapily(int[] source,int i ,int heapSize){
int left = Left(i);
int right = Right(i);
int largest = i;
if(heapSize >= left && source[left-1] > source[i-1] ){
largest = left;
}
if(heapSize >= right && source[right-1] > source[largest-1]){
largest = right;
}
if(largest != i){
SortTool.exchange(source, i-1, largest-1);
maxHeapily(source, largest ,heapSize);
}
}
/**
* 构建最大堆树
* @param source
*/
public void bulidMaxHeap(int[] source){
//beginFlag以后的都是叶子节点。
int beginFlag = (int)Math.floor(source.length/2);
for(int i = beginFlag; i >= 1 ;i--){
maxHeapily(source, i , source.length);
}
}
/**
* 根据序号获得左儿子的序号
*/
public int Left(int i){
return 2*i;
}
/**
* 根据序号获得右儿子的序号
*/
public int Right(int i){
return 2*i + 1;
}
}
辅助类方法
/**
* 交换数组中两元素的位置
* @param source
* @param i
* @param j
*/
public static void exchange(int[] source, int i, int j) {
int bridge = source[i];
source[i] = source[j];
source[j] = bridge;
}
分享到:
相关推荐
《算法导论第四版》系统地介绍了多种排序算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序等。书中不仅解释了每种算法的工作原理和性能特性,还对比了它们在不同情况下的应用效果。此外,作者还...
3. **第五章:排序** - 这一章涵盖了各种排序算法,如冒泡排序、插入排序、选择排序、堆排序以及快速排序等,Java代码将直观地展示这些算法的工作过程。 4. **第八章:图算法** - 图算法包括了Dijkstra最短路径算法...
第6章 堆排序 6.1 堆 6.2 保持堆的性质 6.3 建堆 6.4 堆排序算法 6.5 优先级队列 第7章 快速排序 7.1 快速排序的描述 7.2 快速排序的性能 7.3 快速排序的随机化版本 7.4 快速排序分析 7.4.1 ...
第6章 堆排序 6.1 堆 6.2 保持堆的性质 6.3 建堆 6.4 堆排序算法 6.5 优先级队列 第7章 快速排序 7.1 快速排序的描述 7.2 快速排序的性能 7.3 快速排序的随机化版本 7.4 快速排序分析 7.4.1 ...
《算法导论》是一本广泛认可的计算机科学经典教材,涵盖了算法设计、分析以及实现的核心概念。这本书由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein合著,是全球许多大学计算机科学...
本压缩包文件提供了《算法导论》第二版的课后题答案,涵盖了C++、Java等多种编程语言的实现,这对于自学算法的读者来说是一份宝贵的资源。通过阅读和理解这些答案,你可以更好地理解和应用书中的算法,同时也可以...
《算法导论(第二版)》是一本广受赞誉的计算机科学教材,它深入浅出地介绍了算法的设计、分析和实现。这本书对于学习算法、提升编程能力以及理解复杂度分析至关重要。书中涵盖的内容广泛,包括排序、搜索、图算法、...
根据提供的文件信息,我们可以推断出此文档与“算法导论”有关,但具体到第一部分的内容并未直接给出。为了生成相关知识点,我们将基于“算法导论”这一主题进行展开,探讨该领域的基础概念和技术要点。 ### 算法...
《算法导论(第三版)+Solutions(英文版)》是计算机科学领域的重要参考资料,尤其对于学习和研究算法的学者来说,它堪称经典。这本书深入浅出地介绍了各种算法的设计、分析和实现,旨在帮助读者掌握算法的核心概念...
《算法导论》是计算机科学领域的一本经典教材,它深入浅出地介绍了各种重要的算法,并提供了详尽的实现和分析。"princeton-algorithms-ii"是这本教材的第二部分,主要涵盖了一些高级和复杂的算法主题。在这个压缩包...
书中涵盖了插入排序、选择排序、快速排序、归并排序、堆排序等多种排序算法,并分析了它们的时间复杂度和稳定性。搜索方面,包括线性搜索、二分搜索、哈希搜索以及图的遍历算法如深度优先搜索和广度优先搜索。 四、...
《算法导论(Java版第四版)》是Robert Sedgewick所著的一部经典计算机科学著作,主要关注算法的设计、分析以及用Java语言实现。这本书深入浅出地讲解了计算机科学中最基础且实用的算法,对于学习和理解算法有着极高...
《algs4》是经典算法教材《算法导论第四版》("Introduction to Algorithms, Fourth Edition")的配套 Java 库,由 Princeton 大学的 Eric Demaine 和 Robert Sedgewick 编写。这个资源提供了丰富的算法实现,是学习...
2. **阅读经典书籍**:《算法导论》、《数据结构与算法分析》等书籍可以帮助深入理解算法和数据结构。 3. **参加训练营和讲座**:获取专业指导,学习高级技巧和解题策略。 4. **团队协作**:与他人合作,互相讨论和...
6. 实践应用:理论学习的同时,尝试在编程环境中实现这些算法,如用C++、Java或Python等语言,将理论知识转化为实际操作能力。 7. 拓展学习:除了教材上的知识,还可以参考其他资料,比如经典的《算法导论》、...