parent
f3899ed5ae
commit
e8b5b9a1c4
@ -1,6 +1,6 @@
|
||||
package class03_05;
|
||||
|
||||
public class Code01_PartitionAndQuickSort {
|
||||
public class Code02_PartitionAndQuickSort {
|
||||
|
||||
public static void swap(int[] arr, int i, int j) {
|
||||
int tmp = arr[i];
|
@ -1,256 +0,0 @@
|
||||
package class04;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.PriorityQueue;
|
||||
|
||||
public class Code03_Heap02 {
|
||||
|
||||
// 堆
|
||||
public static class MyHeap<T> {
|
||||
private ArrayList<T> heap;
|
||||
private HashMap<T, Integer> indexMap;
|
||||
private int heapSize;
|
||||
private Comparator<? super T> comparator;
|
||||
|
||||
public MyHeap(Comparator<? super T> com) {
|
||||
heap = new ArrayList<>();
|
||||
indexMap = new HashMap<>();
|
||||
heapSize = 0;
|
||||
comparator = com;
|
||||
}
|
||||
|
||||
public boolean isEmpty() {
|
||||
return heapSize == 0;
|
||||
}
|
||||
|
||||
public int size() {
|
||||
return heapSize;
|
||||
}
|
||||
|
||||
public boolean contains(T key) {
|
||||
return indexMap.containsKey(key);
|
||||
}
|
||||
|
||||
public void push(T value) {
|
||||
heap.add(value);
|
||||
indexMap.put(value, heapSize);
|
||||
heapInsert(heapSize++);
|
||||
}
|
||||
|
||||
public T pop() {
|
||||
T ans = heap.get(0);
|
||||
int end = heapSize - 1;
|
||||
swap(0, end);
|
||||
heap.remove(end);
|
||||
indexMap.remove(ans);
|
||||
heapify(0, --heapSize);
|
||||
return ans;
|
||||
}
|
||||
|
||||
public void resign(T value) {
|
||||
int valueIndex = indexMap.get(value);
|
||||
heapInsert(valueIndex);
|
||||
heapify(valueIndex, heapSize);
|
||||
}
|
||||
|
||||
private void heapInsert(int index) {
|
||||
while (comparator.compare(heap.get(index), heap.get((index - 1) / 2)) < 0) {
|
||||
swap(index, (index - 1) / 2);
|
||||
index = (index - 1) / 2;
|
||||
}
|
||||
}
|
||||
|
||||
private void heapify(int index, int heapSize) {
|
||||
int left = index * 2 + 1;
|
||||
while (left < heapSize) {
|
||||
int largest = left + 1 < heapSize && (comparator.compare(heap.get(left + 1), heap.get(left)) < 0)
|
||||
? left + 1
|
||||
: left;
|
||||
largest = comparator.compare(heap.get(largest), heap.get(index)) < 0 ? largest : index;
|
||||
if (largest == index) {
|
||||
break;
|
||||
}
|
||||
swap(largest, index);
|
||||
index = largest;
|
||||
left = index * 2 + 1;
|
||||
}
|
||||
}
|
||||
|
||||
private void swap(int i, int j) {
|
||||
T o1 = heap.get(i);
|
||||
T o2 = heap.get(j);
|
||||
heap.set(i, o2);
|
||||
heap.set(j, o1);
|
||||
indexMap.put(o1, j);
|
||||
indexMap.put(o2, i);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class Student {
|
||||
public int classNo;
|
||||
public int age;
|
||||
public int id;
|
||||
|
||||
public Student(int c, int a, int i) {
|
||||
classNo = c;
|
||||
age = a;
|
||||
id = i;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class StudentComparator implements Comparator<Student> {
|
||||
|
||||
@Override
|
||||
public int compare(Student o1, Student o2) {
|
||||
return o1.age - o2.age;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
Student s1 = null;
|
||||
Student s2 = null;
|
||||
Student s3 = null;
|
||||
Student s4 = null;
|
||||
Student s5 = null;
|
||||
Student s6 = null;
|
||||
|
||||
s1 = new Student(2, 50, 11111);
|
||||
s2 = new Student(1, 60, 22222);
|
||||
s3 = new Student(6, 10, 33333);
|
||||
s4 = new Student(3, 20, 44444);
|
||||
s5 = new Student(7, 72, 55555);
|
||||
s6 = new Student(1, 14, 66666);
|
||||
|
||||
PriorityQueue<Student> heap = new PriorityQueue<>(new StudentComparator());
|
||||
heap.add(s1);
|
||||
heap.add(s2);
|
||||
heap.add(s3);
|
||||
heap.add(s4);
|
||||
heap.add(s5);
|
||||
heap.add(s6);
|
||||
while (!heap.isEmpty()) {
|
||||
Student cur = heap.poll();
|
||||
System.out.println(cur.classNo + "," + cur.age + "," + cur.id);
|
||||
}
|
||||
|
||||
System.out.println("===============");
|
||||
|
||||
MyHeap<Student> myHeap = new MyHeap<>(new StudentComparator());
|
||||
myHeap.push(s1);
|
||||
myHeap.push(s2);
|
||||
myHeap.push(s3);
|
||||
myHeap.push(s4);
|
||||
myHeap.push(s5);
|
||||
myHeap.push(s6);
|
||||
while (!myHeap.isEmpty()) {
|
||||
Student cur = myHeap.pop();
|
||||
System.out.println(cur.classNo + "," + cur.age + "," + cur.id);
|
||||
}
|
||||
|
||||
System.out.println("===============");
|
||||
|
||||
s1 = new Student(2, 50, 11111);
|
||||
s2 = new Student(1, 60, 22222);
|
||||
s3 = new Student(6, 10, 33333);
|
||||
s4 = new Student(3, 20, 44444);
|
||||
s5 = new Student(7, 72, 55555);
|
||||
s6 = new Student(1, 14, 66666);
|
||||
|
||||
heap = new PriorityQueue<>(new StudentComparator());
|
||||
|
||||
heap.add(s1);
|
||||
heap.add(s2);
|
||||
heap.add(s3);
|
||||
heap.add(s4);
|
||||
heap.add(s5);
|
||||
heap.add(s6);
|
||||
|
||||
s2.age = 6;
|
||||
s4.age = 12;
|
||||
s5.age = 10;
|
||||
s6.age = 84;
|
||||
|
||||
while (!heap.isEmpty()) {
|
||||
Student cur = heap.poll();
|
||||
System.out.println(cur.classNo + "," + cur.age + "," + cur.id);
|
||||
}
|
||||
|
||||
System.out.println("===============");
|
||||
|
||||
s1 = new Student(2, 50, 11111);
|
||||
s2 = new Student(1, 60, 22222);
|
||||
s3 = new Student(6, 10, 33333);
|
||||
s4 = new Student(3, 20, 44444);
|
||||
s5 = new Student(7, 72, 55555);
|
||||
s6 = new Student(1, 14, 66666);
|
||||
|
||||
myHeap = new MyHeap<>(new StudentComparator());
|
||||
|
||||
myHeap.push(s1);
|
||||
myHeap.push(s2);
|
||||
myHeap.push(s3);
|
||||
myHeap.push(s4);
|
||||
myHeap.push(s5);
|
||||
myHeap.push(s6);
|
||||
|
||||
s2.age = 6;
|
||||
myHeap.resign(s2);
|
||||
s4.age = 12;
|
||||
myHeap.resign(s4);
|
||||
s5.age = 10;
|
||||
myHeap.resign(s5);
|
||||
s6.age = 84;
|
||||
myHeap.resign(s6);
|
||||
|
||||
while (!myHeap.isEmpty()) {
|
||||
Student cur = myHeap.pop();
|
||||
System.out.println(cur.classNo + "," + cur.age + "," + cur.id);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 对数器
|
||||
System.out.println("test begin");
|
||||
int maxValue = 100000;
|
||||
int pushTime = 1000000;
|
||||
int resignTime = 100;
|
||||
MyHeap<Student> test = new MyHeap<>(new StudentComparator());
|
||||
ArrayList<Student> list = new ArrayList<>();
|
||||
for(int i = 0 ; i < pushTime; i++) {
|
||||
Student cur = new Student(1,(int) (Math.random() * maxValue), 1000);
|
||||
list.add(cur);
|
||||
test.push(cur);
|
||||
}
|
||||
for(int i = 0 ; i < resignTime; i++) {
|
||||
int index = (int)(Math.random() * pushTime);
|
||||
list.get(index).age = (int) (Math.random() * maxValue);
|
||||
test.resign(list.get(index));
|
||||
}
|
||||
int preAge = Integer.MIN_VALUE;
|
||||
while(test.isEmpty()) {
|
||||
Student cur = test.pop();
|
||||
if(cur.age < preAge) {
|
||||
System.out.println("Oops!");
|
||||
}
|
||||
preAge = cur.age;
|
||||
}
|
||||
System.out.println("test finish");
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package class04;
|
||||
package class04_06;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
@ -1,6 +1,6 @@
|
||||
package class04;
|
||||
package class04_06;
|
||||
|
||||
public class Code02_Heap01 {
|
||||
public class Code02_Heap {
|
||||
|
||||
public static class MyMaxHeap {
|
||||
private int[] heap;
|
@ -1,9 +1,9 @@
|
||||
package class04;
|
||||
package class04_06;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.PriorityQueue;
|
||||
|
||||
public class Code04_HeapSort {
|
||||
public class Code03_HeapSort {
|
||||
|
||||
// 堆排序额外空间复杂度O(1)
|
||||
public static void heapSort(int[] arr) {
|
@ -1,9 +1,9 @@
|
||||
package class04;
|
||||
package class04_07;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.PriorityQueue;
|
||||
|
||||
public class Code05_SortArrayDistanceLessK {
|
||||
public class Code02_SortArrayDistanceLessK {
|
||||
|
||||
public static void sortedArrDistanceLessK(int[] arr, int k) {
|
||||
if (k == 0) {
|
@ -0,0 +1,303 @@
|
||||
package class04_07;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
public class Code03_EveryStepShowBoss {
|
||||
|
||||
public static class Customer {
|
||||
public int value;
|
||||
public int buy;
|
||||
public int order;
|
||||
|
||||
public Customer(int v, int b, int o) {
|
||||
value = v;
|
||||
buy = b;
|
||||
order = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public static class CandidateComparator implements Comparator<Customer> {
|
||||
|
||||
@Override
|
||||
public int compare(Customer o1, Customer o2) {
|
||||
return o1.buy != o2.buy ? (o2.buy - o1.buy) : (o1.order - o2.order);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class DaddyComparator implements Comparator<Customer> {
|
||||
|
||||
@Override
|
||||
public int compare(Customer o1, Customer o2) {
|
||||
return o1.buy != o2.buy ? (o1.buy - o2.buy) : (o1.order - o2.order);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class WhosYourDaddy {
|
||||
private HashMap<Integer, Customer> customers;
|
||||
private HeapGreater<Customer> candHeap;
|
||||
private HeapGreater<Customer> daddyHeap;
|
||||
private final int daddyLimit;
|
||||
public int ctime;
|
||||
public int dtime;
|
||||
|
||||
public WhosYourDaddy(int limit) {
|
||||
customers = new HashMap<Integer, Customer>();
|
||||
candHeap = new HeapGreater<>(new CandidateComparator());
|
||||
daddyHeap = new HeapGreater<>(new DaddyComparator());
|
||||
daddyLimit = limit;
|
||||
ctime = 0;
|
||||
dtime = 0;
|
||||
}
|
||||
|
||||
public void operate(int number, boolean buyOrRefund) {
|
||||
if (!buyOrRefund && !customers.containsKey(number)) {
|
||||
return;
|
||||
}
|
||||
if (!customers.containsKey(number)) {
|
||||
customers.put(number, new Customer(number, 0, 0));
|
||||
}
|
||||
Customer c = customers.get(number);
|
||||
if (buyOrRefund) {
|
||||
c.buy++;
|
||||
} else {
|
||||
c.buy--;
|
||||
}
|
||||
if (c.buy == 0) {
|
||||
customers.remove(number);
|
||||
}
|
||||
if (!candHeap.contains(c) && !daddyHeap.contains(c)) {
|
||||
if (daddyHeap.size() < daddyLimit) {
|
||||
c.order = dTime++;
|
||||
daddyHeap.push(c);
|
||||
} else {
|
||||
c.order = cTime++;
|
||||
candHeap.push(c);
|
||||
}
|
||||
} else if (candHeap.contains(c)) {
|
||||
if (c.buy == 0) {
|
||||
candHeap.remove(c);
|
||||
} else {
|
||||
candHeap.resign(c);
|
||||
}
|
||||
} else {
|
||||
if (c.buy == 0) {
|
||||
daddyHeap.remove(c);
|
||||
} else {
|
||||
daddyHeap.resign(c);
|
||||
}
|
||||
}
|
||||
daddyMove();
|
||||
}
|
||||
|
||||
public List<Integer> getDaddies() {
|
||||
List<Customer> customers = daddyHeap.getAllElements();
|
||||
List<Integer> ans = new ArrayList<>();
|
||||
for (Customer c : customers) {
|
||||
ans.add(c.value);
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
|
||||
private void daddyMove() {
|
||||
if (candHeap.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
if (daddyHeap.size() < daddyLimit) {
|
||||
Customer p = candHeap.pop();
|
||||
p.order = dTime++;
|
||||
daddyHeap.push(p);
|
||||
} else {
|
||||
if (candHeap.peek().buy > daddyHeap.peek().buy) {
|
||||
Customer oldDaddy = daddyHeap.pop();
|
||||
Customer newDaddy = candHeap.pop();
|
||||
oldDaddy.order = cTime++;
|
||||
newDaddy.order = dTime++;
|
||||
daddyHeap.push(newDaddy);
|
||||
candHeap.push(oldDaddy);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static List<List<Integer>> topK(int[] arr, boolean[] op, int k) {
|
||||
List<List<Integer>> ans = new ArrayList<>();
|
||||
WhosYourDaddy whoDaddies = new WhosYourDaddy(k);
|
||||
for (int i = 0; i < arr.length; i++) {
|
||||
whoDaddies.operate(arr[i], op[i]);
|
||||
ans.add(whoDaddies.getDaddies());
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
|
||||
public static int cTime = 0;
|
||||
public static int dTime = 0;
|
||||
|
||||
public static List<List<Integer>> compare(int[] arr, boolean[] op, int k) {
|
||||
HashMap<Integer, Customer> map = new HashMap<>();
|
||||
cTime = 0;
|
||||
dTime = 0;
|
||||
ArrayList<Customer> cands = new ArrayList<>();
|
||||
ArrayList<Customer> daddy = new ArrayList<>();
|
||||
List<List<Integer>> ans = new ArrayList<>();
|
||||
for (int i = 0; i < arr.length; i++) {
|
||||
int num = arr[i];
|
||||
boolean buyOrRefund = op[i];
|
||||
if (!buyOrRefund && !map.containsKey(num)) {
|
||||
ans.add(getCurAns(daddy));
|
||||
continue;
|
||||
}
|
||||
if (!map.containsKey(num)) {
|
||||
map.put(num, new Customer(num, 0, 0));
|
||||
}
|
||||
Customer c = map.get(num);
|
||||
if (buyOrRefund) {
|
||||
c.buy++;
|
||||
} else {
|
||||
c.buy--;
|
||||
}
|
||||
if (c.buy == 0) {
|
||||
map.remove(num);
|
||||
}
|
||||
if (!cands.contains(c) && !daddy.contains(c)) {
|
||||
if (daddy.size() < k) {
|
||||
c.order = dTime++;
|
||||
daddy.add(c);
|
||||
} else {
|
||||
c.order = cTime++;
|
||||
cands.add(c);
|
||||
}
|
||||
}
|
||||
cleanZeroBuy(cands);
|
||||
cleanZeroBuy(daddy);
|
||||
cands.sort(new CandidateComparator());
|
||||
daddy.sort(new DaddyComparator());
|
||||
move(cands, daddy, k);
|
||||
ans.add(getCurAns(daddy));
|
||||
}
|
||||
|
||||
return ans;
|
||||
}
|
||||
|
||||
public static void move(ArrayList<Customer> cands, ArrayList<Customer> daddy, int k) {
|
||||
if (cands.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
if (daddy.size() < k) {
|
||||
Customer c = cands.get(0);
|
||||
c.order = dTime++;
|
||||
daddy.add(c);
|
||||
cands.remove(0);
|
||||
} else {
|
||||
if (cands.get(0).buy > daddy.get(0).buy) {
|
||||
Customer oldDaddy = daddy.get(0);
|
||||
daddy.remove(0);
|
||||
Customer newDaddy = cands.get(0);
|
||||
cands.remove(0);
|
||||
newDaddy.order = dTime++;
|
||||
oldDaddy.order = cTime++;
|
||||
daddy.add(newDaddy);
|
||||
cands.add(oldDaddy);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void cleanZeroBuy(ArrayList<Customer> arr) {
|
||||
List<Customer> noZero = new ArrayList<Customer>();
|
||||
for (Customer c : arr) {
|
||||
if (c.buy != 0) {
|
||||
noZero.add(c);
|
||||
}
|
||||
}
|
||||
arr.clear();
|
||||
for (Customer c : noZero) {
|
||||
arr.add(c);
|
||||
}
|
||||
}
|
||||
|
||||
public static List<Integer> getCurAns(ArrayList<Customer> daddy) {
|
||||
List<Integer> ans = new ArrayList<>();
|
||||
for (Customer c : daddy) {
|
||||
ans.add(c.value);
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
|
||||
// 为了测试
|
||||
public static class Data {
|
||||
public int[] arr;
|
||||
public boolean[] op;
|
||||
|
||||
public Data(int[] a, boolean[] o) {
|
||||
arr = a;
|
||||
op = o;
|
||||
}
|
||||
}
|
||||
|
||||
// 为了测试
|
||||
public static Data randomData(int maxValue, int maxLen) {
|
||||
int len = (int) (Math.random() * maxLen) + 1;
|
||||
int[] arr = new int[len];
|
||||
boolean[] op = new boolean[len];
|
||||
for (int i = 0; i < len; i++) {
|
||||
arr[i] = (int) (Math.random() * maxValue);
|
||||
op[i] = Math.random() < 0.5 ? true : false;
|
||||
}
|
||||
return new Data(arr, op);
|
||||
}
|
||||
|
||||
// 为了测试
|
||||
public static boolean sameAnswer(List<List<Integer>> ans1, List<List<Integer>> ans2) {
|
||||
if (ans1.size() != ans2.size()) {
|
||||
return false;
|
||||
}
|
||||
for (int i = 0; i < ans1.size(); i++) {
|
||||
List<Integer> cur1 = ans1.get(i);
|
||||
List<Integer> cur2 = ans2.get(i);
|
||||
if (cur1.size() != cur2.size()) {
|
||||
return false;
|
||||
}
|
||||
cur1.sort((a, b) -> a - b);
|
||||
cur2.sort((a, b) -> a - b);
|
||||
for (int j = 0; j < cur1.size(); j++) {
|
||||
if (!cur1.get(j).equals(cur2.get(j))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
int maxValue = 20;
|
||||
int maxLen = 200;
|
||||
int maxK = 10;
|
||||
int testTimes = 100000;
|
||||
System.out.println("测试开始");
|
||||
for (int i = 0; i < testTimes; i++) {
|
||||
Data testData = randomData(maxValue, maxLen);
|
||||
int k = (int) (Math.random() * maxK) + 1;
|
||||
int[] arr = testData.arr;
|
||||
boolean[] op = testData.op;
|
||||
List<List<Integer>> ans1 = topK(arr, op, k);
|
||||
List<List<Integer>> ans2 = compare(arr, op, k);
|
||||
if (!sameAnswer(ans1, ans2)) {
|
||||
for (int j = 0; j < arr.length; j++) {
|
||||
System.out.println(arr[j] + " , " + op[j]);
|
||||
}
|
||||
System.out.println(k);
|
||||
System.out.println(ans1);
|
||||
System.out.println(ans2);
|
||||
System.out.println("出错了!");
|
||||
break;
|
||||
}
|
||||
}
|
||||
System.out.println("测试结束");
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,108 @@
|
||||
package class04_07;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
public class HeapGreater<T> {
|
||||
|
||||
private ArrayList<T> heap;
|
||||
private HashMap<T, Integer> indexMap;
|
||||
private int heapSize;
|
||||
private Comparator<? super T> comp;
|
||||
|
||||
public HeapGreater(Comparator<T> c) {
|
||||
heap = new ArrayList<>();
|
||||
indexMap = new HashMap<>();
|
||||
heapSize = 0;
|
||||
comp = c;
|
||||
}
|
||||
|
||||
public boolean isEmpty() {
|
||||
return heapSize == 0;
|
||||
}
|
||||
|
||||
public int size() {
|
||||
return heapSize;
|
||||
}
|
||||
|
||||
public boolean contains(T obj) {
|
||||
return indexMap.containsKey(obj);
|
||||
}
|
||||
|
||||
public T peek() {
|
||||
return heap.get(0);
|
||||
}
|
||||
|
||||
public void push(T obj) {
|
||||
heap.add(obj);
|
||||
indexMap.put(obj, heapSize);
|
||||
heapInsert(heapSize++);
|
||||
}
|
||||
|
||||
public T pop() {
|
||||
T ans = heap.get(0);
|
||||
swap(0, heapSize - 1);
|
||||
indexMap.remove(ans);
|
||||
heap.remove(--heapSize);
|
||||
heapify(0);
|
||||
return ans;
|
||||
}
|
||||
|
||||
public void remove(T obj) {
|
||||
T replace = heap.get(heapSize - 1);
|
||||
int index = indexMap.get(obj);
|
||||
indexMap.remove(obj);
|
||||
heap.remove(--heapSize);
|
||||
if (obj != replace) {
|
||||
heap.set(index, replace);
|
||||
indexMap.put(replace, index);
|
||||
resign(replace);
|
||||
}
|
||||
}
|
||||
|
||||
public void resign(T obj) {
|
||||
heapInsert(indexMap.get(obj));
|
||||
heapify(indexMap.get(obj));
|
||||
}
|
||||
|
||||
public List<T> getAllElements() {
|
||||
List<T> ans = new ArrayList<>();
|
||||
for (T c : heap) {
|
||||
ans.add(c);
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
|
||||
private void heapInsert(int index) {
|
||||
while (comp.compare(heap.get(index), heap.get((index - 1) / 2)) < 0) {
|
||||
swap(index, (index - 1) / 2);
|
||||
index = (index - 1) / 2;
|
||||
}
|
||||
}
|
||||
|
||||
private void heapify(int index) {
|
||||
int left = index * 2 + 1;
|
||||
while (left < heapSize) {
|
||||
int best = left + 1 < heapSize && comp.compare(heap.get(left + 1), heap.get(left)) < 0 ? (left + 1) : left;
|
||||
best = comp.compare(heap.get(best), heap.get(index)) < 0 ? best : index;
|
||||
if (best == index) {
|
||||
break;
|
||||
}
|
||||
swap(best, index);
|
||||
index = best;
|
||||
left = index * 2 + 1;
|
||||
}
|
||||
}
|
||||
|
||||
private void swap(int i, int j) {
|
||||
T o1 = heap.get(i);
|
||||
T o2 = heap.get(j);
|
||||
heap.set(i, o2);
|
||||
heap.set(j, o1);
|
||||
indexMap.put(o2, i);
|
||||
indexMap.put(o1, j);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in new issue