堆排序之java实现
来源:互联网 发布:java集合类特点 编辑:程序博客网 时间:2024/06/06 18:09
堆排序就是利用堆(假设利用大顶堆)进行排序的方法。它的基本思想是,将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根节点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的 n-1 个序列重新构造成一个堆,这样就会得到 n 个元素中次大的值。如此反复执行,便能得到一个有序序列了。
堆排序的时间复杂度为O(nlogn)
public class MaxHeap {int[] heap;int heapsize;public MaxHeap(int[] array){ this.heap=array; this.heapsize=heap.length;}public void BuildMaxHeap(){ for(int i=heapsize/2-1;i>=0;i--) { Maxify(i);//依次向上将当前子树最大堆化 }}public void HeapSort(){ for(int i=0;i<heap.length;i++) { //执行n次,将每个当前最大的值放到堆末尾 int tmp=heap[0]; heap[0]=heap[heapsize-1]; heap[heapsize-1]=tmp; heapsize--; Maxify(0); }}public void Maxify(int i){ int l=Left(i); int r=Right(i); int largest; if(l<heapsize&&heap[l]>heap[i]) largest=l; else largest=i; if(r<heapsize&&heap[r]>heap[largest]) largest=r; if(largest==i||largest>=heapsize)//如果largest等于i说明i是最大元素 largest超出heap范围说明不存在比i节点大的子女 return ; int tmp=heap[i];//交换i与largest对应的元素位置,在largest位置递归调用maxify heap[i]=heap[largest]; heap[largest]=tmp; Maxify(largest);}private int Parent(int i){ return (i-1)/2;}private int Left(int i){ return 2*i+1;}private int Right(int i){ return 2*(i+1);}}
测试代码
int[] array=new int[]{1,2,3,4,7,8,9,10,14,16}; MaxHeap heap=new MaxHeap(array); heap.BuildMaxHeap(); heap.HeapSort(); System.out.println("执行堆排序后数组的内容"); printHeap(heap.heap);
阅读全文
0 0
- 堆排序之Java实现
- 堆排序之Java实现
- 堆排序之java实现
- 堆排序之Java实现
- 堆排序之java实现
- 选择排序之堆排序Java实现
- Java实现排序算法之堆排序
- java实现排序算法之堆排序
- 排序算法之堆排序java实现
- 排序算法之堆排序 Java 实现
- 堆排序(Heapsort)之Java实现
- 堆排序(Heapsort)之Java实现
- 堆排序(Heapsort)之Java实现
- 堆排序算法之JAVA实现
- 堆排序(HeapSort)之java实现
- 数据结构之堆排序java实现
- 堆排序算法之Java实现
- java实现算法之堆排序
- Java-JDK-枚举
- 安卓数据库之 Realm for Androd
- 一张思维导图,让正则表达式不再难懂
- Opencv计算两直线交点
- Linux 64bit启动tomcat,64位linux报错Could not initialize class java.awt.image.BufferedImage
- 堆排序之java实现
- spring boot应用启动原理分析
- c和c++调用Python
- IntelliJ Idea 集成svn 和使用
- 写一个遍历目录下所有文件以及子目录的函数
- Ubuntu16.04静态网络配置
- i=i++表达式的值为什么没有变化?
- JS学习笔记(一)
- Linux运维的20条面试问答