所谓堆,是满足如下条件的一个序列:n个元素,任意第i个元素具备同时不比2i和2i+1个元素小或者大。把堆看成一个完全二叉树,那么这棵树所有左右子节点都要具备同时不比父节点小或者大。
从堆得定义可以看出序列的第一个元素,也就是堆顶元素一定是整个序列里最大或者最小的元素。堆排序就是利用了堆的这一特性来实现的。
堆排序可以简单文字描述如下:1.把一个无序序列调整成一个堆;2.输出堆顶元素,然后把剩下的序列调整成堆。3.如果堆还有元素,继续做操作2。
怎么把一个无序序列调整成一个堆呢?父节点和子节点根据条件不停调整可以得到一个堆,这个过程称之为筛选。把这个序列看成一个完全二叉树,最后一个非叶子节点是第n/2求整个元素,筛选只需要从这一个元素开始递减一直到第一个元素即可。
接着说说取走堆顶元素后,怎么调整这个堆:从堆顶拿走一个最大或者最小值后,把堆得最后一个元素放到堆顶,这时堆顶的两个子节点仍然是堆,这时我们沿着堆顶开始向下筛选,很快就能得到一个新堆了。
堆排序java实现代码:
public class HeapSort extends BaseSort { @Override protected void sortAlg(int[] ls) { buildHeap(ls, ls.length - 1); hsort(ls, ls.length - 1); } private void hsort(int[] ls, int end) { swap(ls, 0, end); for(int i = end-1; i > 0; i--) { maxHeapifyk(ls, 0, i); swap(ls, 0, i); } } private void buildHeap(int[] ls, int end) { for(int i = ((end - 1) >> 1); i >= 0; i--) { maxHeapifyk(ls, i, end); } } /** * Ki>=K2i Ki>=K2i+1 * * @param ls * @param i */ private void maxHeapifyk(int a[], int i, int end) { int maxIndex = i; int finish = (end - 1) >> 1; for(int j = i; j <= finish;) { int left = (j << 1) + 1; int right = left + 1; if(left <= end && a[left] > a[j]) maxIndex = left; if(right <= end && a[right] > a[maxIndex]) maxIndex = right; if(maxIndex != j) { swap(a, maxIndex, j); j = maxIndex; } else { break; } } }
堆排序的时间复杂度稳定在O(nlogn)
相关推荐
最优堆排序算法最优堆排序算法最优堆排序算法最优堆排序算法最优堆排序算法最优堆排序算法
C语言实现的堆排序算法。 提供了堆排序算法的一个接口,可以为其它功能提供功能。
堆排序算法 java
java的堆排序算法实现程序,含测试,可直接运行。java的堆排序算法实现程序,含测试,可直接运行。
一个堆排序算法 c++写的 逻辑相同 可自行 改为java 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一...
算法导论上堆排序算法的vc6.0下的Test实例。
算法设计课程中的最小堆排序算法实现,windows下实现。
堆排序算法其中包含流程图、关键代码、复杂度分析
使用C语言编写的数据结构程序,为堆排序算法的实现。可作为课程设计题目来做。
堆排序算法分析及源代码
根据算法导论第六章实现的堆排序
改进的堆排序算法及其复杂度分析改进的堆排序算法及其复杂度分析改进的堆排序算法及其复杂度分析改进的堆排序算法及其复杂度分析
内部堆排序算法的实现课程设计说明书.doc
简单的堆排序算法:以定长数组为例,动态数组等可以以此类推
用c语言实现堆排序算法,堆排序算法的实现,分析堆排序算法
// 堆排序 #include typedef int InfoType; // 定义其它数据项的类型 #include "compare.h" #include "sort.h" typedef SqList HeapType; // 堆采用顺序表存储表示 void HeapAdjust(HeapType &H,int s,int m) // ...
二叉树的最小堆排序,时间复杂度为O(logn),按照从大到小输出
解决算法中求若干个数的前N位,堆排序是最佳选择。
学习堆排序时自己编的代码,里面有自动生成随机数的代码段方便大家测试