java堆排序算法代码,堆排序实现代码
本文主要以图片的形式讲解堆排序过程,然后用Java代码实现堆排序并分析时间复杂度,具有一定的参考价值。感兴趣的朋友可以了解一下。
1.导言2。图形堆排序3。java代码实现和时间复杂度分析4。总结。
一、引言
优先级队列可以在O(NlogN)时间内进行排序,就像上一篇文章中解决topK问题所用的思路一样,这个思路就是堆排序。
字体这里有一个窍门。如果用新数组存储,需要O(N)空间;但是每次deleteMax都会空一个位置,把末尾的节点过滤下来,那么我们就可以把deleteMax的数据放在末尾。算法思想:通过将数组元素进行buildHeap进行堆序化(构建大顶堆);再对堆进行N-1次deleteMax操作。如果你对二进制堆一无所知,可以看看图示的优先级队列(heap)。
二、图解堆排序(heapsort)
我们从数组下标0开始,不像二进制堆从数组下标1开始。
堆排序过程:
公共类堆排序{
公共静态void main(String[] args) {
Integer[]整数={7,1,13,9,11,5,8 };
System.out.println(原始序列: arrays . tostring(integers));
heapsort(整数);
System.out.println(排序后: arrays . tostring(integers));
}
公共静态T扩展可比?super T void heapsort(T[] a) {
if (null==a a.length==0) {
引发新的RuntimeException(“数组为null或长度为0”);
}
//生成堆
for(int I=a . length/2-1;I=0;我- ) {
percDown(a,I,a . length);
}
//deleteMax
for(int I=a . length-1;I 0;我- ) {
swapReferences(a,0,I);
percDown(a,0,I);
}
}
/**
*向下过滤的方法
*
* @param a:要排序的数组
* @param i:从哪个索引开始过滤?
* @param n:二进制堆的逻辑大小
* @param T
*/
私有静态T扩展可比?super T void percDown(T[] a,int i,int n) {
int child
T tmp
for(tmp=a[I];左孩子;i=儿童){
child=left child(I);
如果(孩子!=n - 1 a【子】。compare to(a[child 1])0 {
孩子;
}
if (tmp.compareTo(a[child]) 0) {
a[I]=a[child];
}否则{
打破;
}
}
a[I]=tmp;
}
private static int left child(int I){
返回2 * I 1;
}
/**
*交换数组中两个位置的元素
*
* @param a:目标数组
* @param index1:第一个元素的下标
* @param index2:第二个元素下标
* @param T
*/
private static T void swa preferences(T[]a,int index1,int index2) {
t tmp=a[index 1];
a[索引1]=a[索引2];
a[index 2]=tmp;
}
}
//输出结果
//原序列:[7,1,13,9,11,5,8]
//排序后:[1,5,7,8,9,11,13]代码实现构建堆使用O(N)的时间。向下筛选元素需要O(logN),需要N-1次,所以总共需要O (n (n-1) logn)=
时间复杂度:用自己的存储,无疑是O(NlogN)。。
三、java代码实现及时间复杂度分析
这篇文章通过绘图演示了堆排序的过程。很清楚稳定在O(NlogN)。是Java学习的堆排序流程图和代码讲解的详细内容。更多请关注其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。