0
点赞
收藏
分享

微信扫一扫

堆(Java)

北溟有渔夫 2022-06-28 阅读 74

本专栏目录

​​蓝桥杯算法竞赛大纲​​​​数论相关​​​(Java)​

​​​枚举相关(Java)​​

​​​对象排序(Java)​​

​​​字符串相关(Java)​​

​​​排序相关算法(Java)​​

​​​记忆化搜索(Java)​​

​​​树论相关(Java)​​

​​​图论相关(Java)​​​ 堆(Java)
​​​贪心(Java)​​


文章目录

  • ​​关于堆的判断​​
  • ​​数组建堆​​
  • ​​依次插入建堆​​
  • ​​优先队列​​

关于堆的判断

package ;

import java.util.Scanner;

// https://pintia.cn/problem-sets/994805046380707840/problems/994805064676261888
public class _关于堆的判断 {

static int n,m;
static int[] arr;

public static void main(String[] args) {

Scanner scan = new Scanner(System.in);
n = scan.nextInt();
m = scan.nextInt();

arr = new int[n+1];

for (int i = 1; i <= n; i++) {
arr[i] = scan.nextInt();
updateSmallHeap(i);
}

scan.nextLine();

for (int i = 0; i < m; i++) {
String line = scan.nextLine();
String[] strArr = line.split(" ");

if (line.contains("root")){
int x = Integer.parseInt(strArr[0]);

if (arr[1]==x){
System.out.println("T");
} else {
System.out.println("F");
}

}else if (line.contains("and")){
int a = Integer.parseInt(strArr[0]);
int b = Integer.parseInt(strArr[2]);

a = find(a);
b = find(b);

if (arr[a/2]==arr[b/2]){
System.out.println("T");
}else {
System.out.println("F");
}
}else if (line.contains("parent")){
int a = Integer.parseInt(strArr[0]);
int b = Integer.parseInt(strArr[5]);

b = find(b);

if (arr[b/2]==a){
System.out.println("T");
}else {
System.out.println("F");
}

}else {
int a = Integer.parseInt(strArr[0]);
int b = Integer.parseInt(strArr[5]);

a = find(a);
if (arr[a/2]==b){
System.out.println("T");
}else {
System.out.println("F");
}
}
}
}

public static int find(int x){

for (int i = 1; i <= n; i++) {
if (arr[i]==x){
return i;
}
}
return 0;
}

private static void updateSmallHeap(int i) {

if (i==1) return;
// 上浮操作
while (i!=1){
if (arr[i]<arr[i/2]){
int t = arr[i];
arr[i] = arr[i/2];
arr[i/2] = t;
}
i /= 2;
}
}
}

数组建堆

package ;

import java.util.Arrays;

public class _数组建堆 {

public static void main(String[] args) {

int[] arr = {1,3,3,4,4,5,1,23,3,321,2,31,23,5,54};

int n = arr.length-1;

// 将数组调整为大顶堆
for (int i = ((n-1)/2); i >= 0; i--) {
adjustBigHeap(arr, i, n);
}

System.out.println(Arrays.toString(arr));

// 将数组调整为小顶堆
for (int i = ((n-1)/2); i >= 0; i--) {
adjustSmallHeap(arr, i, n);
}

System.out.println(Arrays.toString(arr));

}

public static void adjustBigHeap(int[] arr, int index, int last){

// 向下更新
for (int left = index * 2 + 1; left <= last; left = left * 2 + 1) {

int right = left + 1;
if (right <= last && arr[left] < arr[right]){
left = right;
}

if (arr[left] > arr[(left-1)/2]){

int t = arr[left];
arr[left] = arr[(left-1)/2];
arr[(left-1)/2] = t;

}else {
break;
}
}
}

public static void adjustSmallHeap(int[] arr, int index, int last){

for (int left = index * 2 + 1; left <= last; left = left * 2 + 1) {

int right = left + 1;
if (right <= last && arr[left] > arr[right]){
left = right;
}

if (arr[left] < arr[(left-1)/2]){

int t = arr[left];
arr[left] = arr[(left-1)/2];
arr[(left-1)/2] = t;

}else {
break;
}
}
}
}

依次插入建堆

package ;

import java.util.Arrays;
import java.util.Scanner;

public class _依次插入建堆 {

static int n;
static int[] arr;

public static void main(String[] args) {

Scanner scan = new Scanner(System.in);

n = scan.nextInt();
arr = new int[n];

for (int i = 0; i < n; i++) {
arr[i] = scan.nextInt();
// updateBigHeap(i);
updateSmallHeap(i);
}

System.out.println(Arrays.toString(arr));
}

// 依次插入构建大顶堆
public static void updateBigHeap(int ind){

// 往上更新
while (ind>0){

if (arr[ind]<=arr[(ind-1)/2]){
return;
}

int t = arr[ind];
arr[ind] = arr[(ind-1)/2];
arr[(ind-1)/2] = t;

ind = (ind-1) / 2;
}
}

// 依次插入构建小顶堆
public static void updateSmallHeap(int ind){
while (ind>0){

if (arr[ind]>=arr[(ind-1)/2]){
return;
}

int t = arr[ind];
arr[ind] = arr[(ind-1)/2];
arr[(ind-1)/2] = t;

ind = (ind-1) / 2;
}
}
}

优先队列

package ;

public class _优先队列 {

public static void main(String[] args) {

PriorityQueue queue = new PriorityQueue(20);

queue.push(new Node(10, "xiaowang"));
queue.push(new Node(13, "xiaoli"));
queue.push(new Node(11, "xiaomei"));
queue.push(new Node(3, "xiaozhao"));
queue.push(new Node(9, "xiaoba"));

while (!queue.isEmpty()){

System.out.println(queue.poll().id);
}

}

static class PriorityQueue{

int maxsize;
int last = -1; // 最后一个元素下标
Node[] BigHeap;

public PriorityQueue(int maxsize) {
this.maxsize = maxsize;
BigHeap = new Node[maxsize];
}

public boolean isEmpty(){

if (last==-1){
return true;
}
return false;
}

public void push(Node node){

if (last == maxsize-1){
System.out.println("队列满了");
return;
}

BigHeap[++last] = node;
updateBigHeap(last);
}

public Node poll(){

if (last<0){
System.out.println("队列为空");
return null;
}

Node curr = BigHeap[0];

BigHeap[0] = BigHeap[last];
last--;

adjustBigHeap(0,last);

return curr;
}


// 将ind为根的子树调整为大顶堆
private void adjustBigHeap(int ind, int last) {


for (int left = ind * 2 + 1; left <= last; left = left * 2 + 1) {

int right = left + 1;

if (right <= last && BigHeap[right].prioriy > BigHeap[left].prioriy){
left = right;
}

if (BigHeap[left].prioriy > BigHeap[(left-1)/2].prioriy){

Node node = BigHeap[left];
BigHeap[left] = BigHeap[(left-1)/2];

BigHeap[(left-1)/2] = node;

}else {
return;
}
}
}

public Node peek(){
return BigHeap[0];
}

// 依次插入建堆
public void updateBigHeap(int ind){

// 更新插入元素的位置
while (ind>0){

if (BigHeap[ind].prioriy <= BigHeap[(ind-1)/2].prioriy){
return;
}

Node node = BigHeap[ind];
BigHeap[ind] = BigHeap[(ind-1)/2];
BigHeap[(ind-1)/2] = node;

ind = (ind-1) / 2;
}
}
}

static class Node{
int prioriy;
String id;

public Node(int prioriy, String id) {
this.prioriy = prioriy;
this.id = id;
}
}
}


举报

相关推荐

0 条评论