堆+建堆、插入、删除、排序+java实现
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实现的更多相关文章
- Python3实现最小堆建堆算法
今天看Python CookBook中关于“求list中最大(最小)的N个元素”的内容,介绍了直接使用python的heapq模块的nlargest和nsmallest函数的解决方式,记得学习数据结构 ...
- 最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)
堆有最大堆和最小堆之分,最大堆就是每个节点的值都>=其左右孩子(如果有的话)值的完全二叉树.最小堆便是每个节点的值都<=其左右孩子值的完全二叉树. 设有n个元素的序列{k1,k2,..., ...
- 堆(Heap)详解——Java实现
Heap 堆定义:(这里只讲二叉堆)堆实为二叉树的一种,分为最小堆和最大堆,具有以下性质: 任意节点小于/大于它的所有后裔,最小/大元在堆的根上. 堆总是一棵完全二叉树 将根节点最大的堆叫做最大堆或大 ...
- 建堆复杂度O(n)证明
堆排序中首先需要做的就是建堆,广为人知的是建堆复杂度才O(n),它的证明过程涉及到高等数学中的级数或者概率论,不过证明整体来讲是比较易懂的. 堆排过程 代码如下 void print(vector&l ...
- B-Tree插入和删除的Java实现
B-Tree插入和删除的Java实现 一.一颗非空m阶B-Tree的性质 除根结点以外的每个结点的孩子引用最多存在m个,关键码最多存在m - 1个:除根结点以外的每个结点的孩子引用至少存在⌈m / 2 ...
- Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)
--reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...
- java中的TreeMap如何顺序按照插入顺序排序
java中的TreeMap如何顺序按照插入顺序排序 你可以使用LinkedHashMap 这个是可以记住插入顺序的. 用LinkedHashMap吧.它内部有一个链表,保持插入的顺序.迭代的时候,也 ...
- 建堆是 O(n) 的时间复杂度证明。
建堆的复杂度先考虑满二叉树,和计算完全二叉树的建堆复杂度一样. 对满二叉树而言,第 \(i\) 层(根为第 \(0\) 层)有 \(2^i\) 个节点. 由于建堆过程自底向上,以交换作为主要操作,因此 ...
- 502. IPO(最小堆+最大堆法 or 排序法)
题目: 链接:https://leetcode-cn.com/problems/ipo/submissions/ 假设 力扣(LeetCode)即将开始其 IPO.为了以更高的价格将股票卖给风险投资公 ...
随机推荐
- Caused by: java.lang.ClassNotFoundException: Illegal access: this web application instance has been stopped already. Could not load [org.jboss.netty.util.internal.ByteBufferUtil]. The following stack
Caused by: java.lang.ClassNotFoundException: Illegal access: this web application instance has been ...
- Nginx和PHP上传文件大小的限制
Nginx client_max_body_size 80m; PHP php.ini file_uploads = on ; 是否允许通过HTTP上传文件的开关.默认为ON即是开 upload_tm ...
- 用switch语句根据消费金额计算折扣
最终输出效果: 代码: package com.mingrisoft; import java.util.Scanner; public class ProductPrice { public sta ...
- 简易DVD查询系统
==========DVD管理系统========== 这是DVD任务管理器的主界面: package day20181224; import java.text.ParseException; im ...
- 20145320《网络对抗》注入Shellcode并执行
20145320注入Shellcode并执行 准备一段Shellcode 首先先准备一段C语言代码:这段代码其实和我们的shell功能基本一样 为了之后能够看到反汇编的结果,这次采用的静态编译.正常返 ...
- Java常用API-高级
---恢复内容开始--- Object类是Java语言中的根类,即所有类的父类.它中描述的所有方法子类都可以使用.所有类在创建对象的时候,最终找的父类就是Object. * String toStri ...
- InstallShield安装包在Win7下权限问题的解决方案 (转载)
转载:http://blog.csdn.net/wuzhengqing1/article/details/6570149 转载:http://blog.csdn.net/brikoff/article ...
- CAN通信工作原理个人心得
CAN总线结构示意图: 说明: 1:CAN收发器(示意图中的单元)根据两总线CAN_H和CAN_L的电位差来判断总线电平: 2:实际中CAN_H与CAN_L由双绞线组成: 3:数据传递终端的电阻器,是 ...
- NetworkExtension
一, 按照网上的方法: iOS 无法获取 WiFi 列表?一定是因为你不知道这个框架 提交了申请.两个小时候后苹果回应邮件.意思就是如果只是使用 App Proxy, Content Filter, ...
- CSS的再深入3(更新中···)
在前面,我们学习了标准文档流,但在实际制作的过程中,用标准文档流书写显然是不现实的,因此,我们来了解几种脱离标准文档流的方法: 1.float 浮动 float:left/right:(左浮/右浮) ...