`

最大堆排序java实现(算法导论第6章)

阅读更多
主程序:
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;
	}
分享到:
评论

相关推荐

    算法导论第四版 英文

    《算法导论第四版》系统地介绍了多种排序算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序等。书中不仅解释了每种算法的工作原理和性能特性,还对比了它们在不同情况下的应用效果。此外,作者还...

    算法导论第1-16章编程题答案

    3. **第五章:排序** - 这一章涵盖了各种排序算法,如冒泡排序、插入排序、选择排序、堆排序以及快速排序等,Java代码将直观地展示这些算法的工作过程。 4. **第八章:图算法** - 图算法包括了Dijkstra最短路径算法...

    算法导论(part2)

    第6章 堆排序 6.1 堆 6.2 保持堆的性质 6.3 建堆 6.4 堆排序算法 6.5 优先级队列 第7章 快速排序 7.1 快速排序的描述 7.2 快速排序的性能 7.3 快速排序的随机化版本 7.4 快速排序分析 7.4.1 ...

    算法导论(part1)

    第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等多种编程语言的实现,这对于自学算法的读者来说是一份宝贵的资源。通过阅读和理解这些答案,你可以更好地理解和应用书中的算法,同时也可以...

    算法导论(第二版)及习题解答

    《算法导论(第二版)》是一本广受赞誉的计算机科学教材,它深入浅出地介绍了算法的设计、分析和实现。这本书对于学习算法、提升编程能力以及理解复杂度分析至关重要。书中涵盖的内容广泛,包括排序、搜索、图算法、...

    算法导论 part1

    根据提供的文件信息,我们可以推断出此文档与“算法导论”有关,但具体到第一部分的内容并未直接给出。为了生成相关知识点,我们将基于“算法导论”这一主题进行展开,探讨该领域的基础概念和技术要点。 ### 算法...

    算法导论(第三版)+Solutions(英文版)

    《算法导论(第三版)+Solutions(英文版)》是计算机科学领域的重要参考资料,尤其对于学习和研究算法的学者来说,它堪称经典。这本书深入浅出地介绍了各种算法的设计、分析和实现,旨在帮助读者掌握算法的核心概念...

    princeton-algorithms-ii:算法导论代码,第二部分

    《算法导论》是计算机科学领域的一本经典教材,它深入浅出地介绍了各种重要的算法,并提供了详尽的实现和分析。"princeton-algorithms-ii"是这本教材的第二部分,主要涵盖了一些高级和复杂的算法主题。在这个压缩包...

    算法 英文版第4版.pdf

    书中涵盖了插入排序、选择排序、快速排序、归并排序、堆排序等多种排序算法,并分析了它们的时间复杂度和稳定性。搜索方面,包括线性搜索、二分搜索、哈希搜索以及图的遍历算法如深度优先搜索和广度优先搜索。 四、...

    Algorithms In Java (4th)

    《算法导论(Java版第四版)》是Robert Sedgewick所著的一部经典计算机科学著作,主要关注算法的设计、分析以及用Java语言实现。这本书深入浅出地讲解了计算机科学中最基础且实用的算法,对于学习和理解算法有着极高...

    algs4:使用 Java 中的书籍算法学习算法的练习的回购

    《algs4》是经典算法教材《算法导论第四版》("Introduction to Algorithms, Fourth Edition")的配套 Java 库,由 Princeton 大学的 Eric Demaine 和 Robert Sedgewick 编写。这个资源提供了丰富的算法实现,是学习...

    第六届全国信息技术应用水平大赛-B卷

    2. **阅读经典书籍**:《算法导论》、《数据结构与算法分析》等书籍可以帮助深入理解算法和数据结构。 3. **参加训练营和讲座**:获取专业指导,学习高级技巧和解题策略。 4. **团队协作**:与他人合作,互相讨论和...

    烟台大学的数据结构试题及答案

    6. 实践应用:理论学习的同时,尝试在编程环境中实现这些算法,如用C++、Java或Python等语言,将理论知识转化为实际操作能力。 7. 拓展学习:除了教材上的知识,还可以参考其他资料,比如经典的《算法导论》、...

Global site tag (gtag.js) - Google Analytics