整理网上的最大堆及最小堆代码

public abstract class Sorter {public abstract void sort(int[] array);
}
public class HeapSorter extends Sorter {@Overridepublic void sort(int[] array) {heapSort(array);}/*** 堆排序方法* 基于大根堆实现* @param array*/private void heapSort(int[] array) {Integer tmp;//暂存交换元素buildHeap(array);//执行初始建堆,并调整for (int i=0;i<array.length;i++){// 交换堆顶元素array[0]和堆中最后一个元素array[array.length-1-i]tmp=array[0];array[0]=array[array.length-i-1];array[array.length-i-1]=tmp;// 每次交换堆顶元素和堆中最后一个元素之后,都要对堆进行调整adjustHeap(array,0,array.length-i-1);}}/*** <p>* 调整堆的方法* @param i 待调整结点的索引* @param m 待调整堆的结点的数量(即:排除叶子结点)*/private void adjustHeap(int[] array, int i, int m) {Integer tmp = array[i]; // 当前待调整的结点int s = 2 * i + 1; // 当前待调整结点的左孩子结点的索引(s+1为当前调整结点的右孩子结点的索引)while (s < m) {if (s + 1 < m && array[s] < array[s + 1]) { // 如果右孩子大于左孩子(找到比当前待调整结点大的孩子结点)s=s+1;}if (array[i]<array[s]){array[i]=array[s];// 孩子结点大于当前待调整结点,将孩子结点放到当前待调整结点的位置上i=s;// 重新设置待调整的下一个结点的索引s=2*i+1;}else{// 如果当前待调整结点大于它的左右孩子,则不需要调整,直接退出break;}array[i]=tmp;// 当前待调整的结点放到比其大的孩子结点位置上}}/*** 建堆方法* 并调整0-array.length/2个节点,保持堆的性质* @param array*/private void buildHeap(int[] array) {// 求出当前堆中最后一个存在孩子结点的索引int pos=(array.length-1)/2;// 从该结点结点开始,执行建堆操作for (int i=pos;i>=0;i--){adjustHeap(array,i,array.length);// 在建堆过程中,及时调整堆中索引为i的结点}}/*** 最小堆* @param a* @param n*///构建最小堆public static void MakeMinHeap(int a[], int n){for(int i=(n-1)/2 ; i>=0 ; i--){MinHeapFixdown(a,i,n);}}//从i节点开始调整,n为节点总数 从0开始计算 i节点的子节点为 2*i+1, 2*i+2public static void MinHeapFixdown(int a[],int i,int n){int j = 2*i+1; //子节点int temp = 0;while(j<n){//在左右子节点中寻找最小的if(j+1<n && a[j+1]<a[j]){j++;}if(a[i] <= a[j])break;//较大节点下移temp = a[i];a[i] = a[j];a[j] = temp;i = j;j = 2*i+1;}}public static void MinHeap_Sort(int a[],int n){int temp = 0;MakeMinHeap(a,n);for(int i=n-1;i>0;i--){temp = a[0];a[0] = a[i];a[i] = temp;MinHeapFixdown(a,0,i);}}public static void main(String[] args) {int array[]={1,6,9,45,65,12,3,4,578,78,5,6,13,458,12,456,789,123};HeapSorter heapSorter=new HeapSorter();heapSorter.heapSort(array);
//        heapSorter.MinHeap_Sort(array,array.length);for (int i:array){System.out.print(i+" ");}System.out.println(" ");}
}

Java 堆排序(大根堆及小根堆)相关推荐

  1. C语言实现选择排序——堆排序(大根堆、小根堆)

    C语言实现堆排序 文章目录 C语言实现堆排序 大根堆排序算法 1.交换操作 2.对结点进行调整为大根堆 3.建立大根堆 4.大根堆排序算法实现 小根堆排序算法 1.交换操作 2.对结点进行调整为小根堆 ...

  2. 浅谈大根堆,小根堆,以及堆排序(python)实现

    既然要说堆排序,那么必然要说说什么是大根堆,小根堆了. 大根堆: 若根节点存在左右子节点,那么根节点的值大于或等于左右子节点的值. 小根堆: 若根节点存在左右子节点,那么根节点的值小于或等于左右子节点 ...

  3. 大根堆和小根堆的区别

    大根堆和小根堆的区别 文章转自:https://blog.csdn.net/weixin_37197708/article/details/79546535 堆的概念 堆实际上是一棵完全二叉树,其任何 ...

  4. 大根堆与小根堆的理解,如何手写一个堆,以及什么时候用自己手写的堆,什么时候用语言提供堆的api,(二者的区别)

    大根堆与小根堆的理解,如何手写一个堆,以及什么时候用自己手写的堆,什么时候用语言提供堆的api,(二者的区别) 定义 Heap是一种数据结构具有以下的特点: 1)完全二叉树: 2)heap中存储的值是 ...

  5. 堆(Heap)大根堆、小根堆

    目录 堆(Heap)大根堆.小根堆 1.堆的存储: 2.堆的操作:insert 3.堆的操作:Removemax 4.堆的操作:buildHeap 堆化数组 5.堆排序 堆(Heap)大根堆.小根堆 ...

  6. 堆(大根堆、小根堆)

    完全二叉堆 堆又可称之为完全二叉堆.这是一个逻辑上基于完全二叉树.物理上一般基于线性数据结构(如数组.向量.链表等)的一种数据结构. 完全二叉树的存储结构 学习过完全二叉树的同学们都应该了解,完全二叉 ...

  7. 堆结构 - 大根堆、小根堆

    在开发语言中,heap在使用层次的名字叫PriorityQueue(优先级队列),PriorityQueue数据结构的名字就叫做堆,底层就是用堆结构实现的. 完全二叉树 空树也算是完全二叉树 每一层都 ...

  8. 小根堆java_小根堆的Java实现

    1. 堆 堆是完全二叉树的数组形式,由于堆没有指针指向,所以可以利用下标来模拟指向,假设 i 为父节点,那么 2i+1 为左孩子,2i+2 为右孩子.假设 i 为当前节点,那么 (i - 1) / 2 ...

  9. 堆排序【手写小根堆】

    一.什么是堆呢? 堆是一个高效的优先级队列,我们可以把堆看做一棵完全二叉树的数组. 性质: 堆中某个结点的值总是不大于或不小于其父结点的值 堆总是一棵完全二叉树 根结点最大的堆叫做最大堆或大根堆,根结 ...

  10. 【数据结构】堆,大根堆,小根堆,优先队列 详解

    目录 堆 1.堆的数组实现 2.小根堆 3.大根堆 4.优先队列 例题 1.SP348 EXPEDI - Expedition(有趣的贪心思路,优先队列) 2.合并果子 堆 要了解堆之前,请先了解树, ...

最新文章

  1. 使用 ZwUnmapViewOfSection 卸载并替换内存镜像
  2. 装配bean的三种方式
  3. boost::mp11::mp_min_element_q相关用法的测试程序
  4. 完整的连接器设计手册_Harwin连接器展示在深井探油应用中不受环境影响的价值...
  5. python特殊函数__str__、__repr__和__len__
  6. 九度oj题目1518:反转链表
  7. 诗与远方:无题(十四)
  8. python自动复制,Python数组自动相互复制
  9. 【Flink】Flink 实时超时统计-A发生B不发生事件统计-不发生事件
  10. HTTP协议——学习资料小结
  11. python类使用异步_异步Python类
  12. AutoCAD块属性提取
  13. Linux team多网卡绑定
  14. dell r720光盘启动项_Dell R720服务器安装操作系统
  15. Java开发月薪两万,需要达到怎样的技术水平?
  16. kali linux 虚拟机iso 下载,Kali Linux 2016.2发布提供虚拟机以及系统镜像下载
  17. 从运维角度聊下:如何维护一套 DevOps 系统
  18. 基于python的深度学习框架有_《用Python实现深度学习框架》上市
  19. MySQL数据库——MySQL查看存储过程
  20. php做网站步骤_新手如何用PHP开发一个完整的网站?

热门文章

  1. PHP fuser,打印机提示 50.1 fuser error 这样的错误,无法正常打印?
  2. LMS激光传感器的TCP/IP协议问题
  3. 百度杀毒,360安全卫士的那些私下的功夫 。
  4. FreeBSD安装MySQL
  5. 网络安全工程师面试题汇总
  6. Ubuntu傻瓜式录制GIF图—— Peek
  7. 凸多边形、凹多边形、凸包算法
  8. Andorid连接USB打印机
  9. Java 有序的Map —— LinkedHashMap
  10. matlab求线性规划最大值,matlab线性规划算例