package testpackage;

import java.util.Arrays;

public class Heap {
//建立大顶堆
public static void buildMaxHeap(int[] a) {
for(int i=(a.length/2)-1;i>=0;i--) {
adjustDown(a,i,a.length);
}
}
//向下调整
public static void adjustDown(int[] a,int i,int len) {
int temp,j;
temp=a[i];
for(j=2*i+1;j<len;j=2*j+1) { //j为当前i的子节点,默认为左节点
if(j+1<len&&a[j+1]>a[j]) //如果右节点大,则选右节点
j++;
if(a[j]<=temp) //若子节点都比初始值temp小,说明找到了位置
break;
else {
a[i]=a[j]; //如果没有终止,那么将子节点中数值大的上调至i处
i=j; //同时i下降到j这个位置
}
}
a[i]=temp; //将temp放在最终的位置
}
//堆排序
public static void heapSort(int[] a) {
buildMaxHeap(a);
for(int i=a.length-1;i>=0;i--) {
int temp=a[0];
a[0]=a[i];
a[i]=temp;
adjustDown(a,0,i); //将剩余len-1调整为大顶堆,循环,所以用i表示
}
}
//向上浮动
public static void adjustUp(int[] a,int i) {
int temp,j;
temp=a[i];
j=(i-1)/2;
while(j>=0&&a[j]<temp) {
a[i]=a[j];
i=j;
j=(j-1)/2;
}
a[i]=temp;
}
//插入
public static int[] insert(int[] a,int num) {
int[] b=new int[a.length+1];
int i,j;
i=0;
j=0;
while(i<a.length) b[j++]=a[i++];
b[a.length]=num;
adjustUp(b,a.length);
return b;
}
//删除(删除时有规则的,堆顶元素才会被删除)
public static int[] delete(int[] a) {
int temp=a[0];
a[0]=a[a.length-1];
a[a.length-1]=temp;
adjustDown(a,0,a.length-1);
int[] b=new int[a.length-1];
int i,j;
i=j=0;
while(i<a.length-1) b[j++]=a[i++];
return b; }
public static void main(String[] args) {
int[] a= {5,88,45,37,91,26,13,66,50};
buildMaxHeap(a); //建堆
System.out.println(Arrays.toString(a));
a=insert(a,77); //插入
System.out.println(Arrays.toString(a));
a=delete(a); //删除,只能删除堆顶元素
System.out.println(Arrays.toString(a));
heapSort(a); //排序
System.out.println(Arrays.toString(a));
}
}

堆+建堆、插入、删除、排序+java实现的更多相关文章

  1. Python3实现最小堆建堆算法

    今天看Python CookBook中关于“求list中最大(最小)的N个元素”的内容,介绍了直接使用python的heapq模块的nlargest和nsmallest函数的解决方式,记得学习数据结构 ...

  2. 最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)

    堆有最大堆和最小堆之分,最大堆就是每个节点的值都>=其左右孩子(如果有的话)值的完全二叉树.最小堆便是每个节点的值都<=其左右孩子值的完全二叉树. 设有n个元素的序列{k1,k2,..., ...

  3. 堆(Heap)详解——Java实现

    Heap 堆定义:(这里只讲二叉堆)堆实为二叉树的一种,分为最小堆和最大堆,具有以下性质: 任意节点小于/大于它的所有后裔,最小/大元在堆的根上. 堆总是一棵完全二叉树 将根节点最大的堆叫做最大堆或大 ...

  4. 建堆复杂度O(n)证明

    堆排序中首先需要做的就是建堆,广为人知的是建堆复杂度才O(n),它的证明过程涉及到高等数学中的级数或者概率论,不过证明整体来讲是比较易懂的. 堆排过程 代码如下 void print(vector&l ...

  5. B-Tree插入和删除的Java实现

    B-Tree插入和删除的Java实现 一.一颗非空m阶B-Tree的性质 除根结点以外的每个结点的孩子引用最多存在m个,关键码最多存在m - 1个:除根结点以外的每个结点的孩子引用至少存在⌈m / 2 ...

  6. Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)

    --reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...

  7. java中的TreeMap如何顺序按照插入顺序排序

    java中的TreeMap如何顺序按照插入顺序排序 你可以使用LinkedHashMap  这个是可以记住插入顺序的. 用LinkedHashMap吧.它内部有一个链表,保持插入的顺序.迭代的时候,也 ...

  8. 建堆是 O(n) 的时间复杂度证明。

    建堆的复杂度先考虑满二叉树,和计算完全二叉树的建堆复杂度一样. 对满二叉树而言,第 \(i\) 层(根为第 \(0\) 层)有 \(2^i\) 个节点. 由于建堆过程自底向上,以交换作为主要操作,因此 ...

  9. 502. IPO(最小堆+最大堆法 or 排序法)

    题目: 链接:https://leetcode-cn.com/problems/ipo/submissions/ 假设 力扣(LeetCode)即将开始其 IPO.为了以更高的价格将股票卖给风险投资公 ...

随机推荐

  1. C++ STL--顺序容器(vector)

    STL(标准模板库) 一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量.链表.队列.栈. C++标准模板库的核心包含以下组件: ...

  2. 搭建ssm框架

    我现在在着手搭建一个项目ssm+angularsJs的框架 以下是目录结构 将所有的依赖全部引入到父工程中,然后在子工程中需要的时候,再引入,父工程只是用来引入依赖 <!-- 集中定义依赖版本号 ...

  3. Golang原生sql操作Mysql数据库增删改查

    Golang要操作mysql数据库,首先需要在当期系统配置GOPATH,因为需要使用go get命令把驱动包下载到GOPATH下使用. 首先配置好你的GOPATH,执行以下命令,下载安装mysql驱动 ...

  4. Python3 自定义请求头消息headers

    Python3 自定义请求头消息headers 使用python爬虫爬取数据的时候,经常会遇到一些网站的反爬虫措施,一般就是针对于headers中的User-Agent,如果没有对headers进行设 ...

  5. python网络编程及高并发问题

    面试其他篇 目录: 1.1

  6. python简说(十三)递归

    #递归就是函数自己调用自己count = 0# def abc():# pass# abc()最多循环999次

  7. Magnum Kubernetes源码分析(一)

    Magnum版本说明 本文以magnum的mitaka版本代码为基础进行分析. Magnum Kubernetes Magnum主要支持的概念有bay,baymodel,node,pod,rc,ser ...

  8. Java多线程编程作业总结

    一.多线程知识总结 1.线程同步 有关创建线程的知识就不过多的叙述了.就从主要的开始讲吧,讲一下线程的同步.与操作系统中的进程同步一样,线程同样面临着资源共享的问题,怎样处理线程的资源共享是运用多线程 ...

  9. [内核驱动] DOS路径转化为NT路径

    转载:http://blog.csdn.net/qq_33504040/article/details/78468278 最近在做一个文件过滤驱动程序,禁止访问指定目录或文件.想要从R3给R0发命令和 ...

  10. Click()与Submit()

    <input type="button" /> 定义可点击的按钮,但没有任何行为.如果你不写javascript 的话,按下去什么也不会发生. button 类型常用于 ...