//
// Created by TeneChang on 2020/10/28.
//
#include "Heap.h"
#include <iostream>
using namespace std;
Heap::Heap(bool _isMaxHeap) {
IsMaxHeap = _isMaxHeap;
}
Heap::Heap(int _Key[], int _VertexN, bool _IsMaxHeap) {
IsMaxHeap = IsMaxHeap;
VertexN = 0;
for(int i = 1; i <= _VertexN; i++){
Insert(_Key[i]);
}
}
void Heap::ShiftUp(int i) {
if(i == 1)
return;
while(i > 1){
if(Compare(Key[i],Key[i/2])){
swap(Key[i],Key[i/2]);
} else break;
//shift up util it is smaller than its parent or reaches the top
i = i/2;
}
return;
}
void Heap::ShiftDown(int i, int n) {
//node i is a leaf node
if(2*i > n)
return;
while(2*i <= n){
//swap with the larger children
i = 2*i;
if(i+1 <= n && Compare(Key[i+1],Key[i])){
i = i+1;
}
if(Compare(Key[i],Key[i/2])){
swap(Key[i],Key[i/2]);
} else break;
}
return;
}
void Heap::Insert(int key) {
VertexN++;
Key[VertexN] = key;
ShiftUp(VertexN);
}
void Heap::Delete(int i) {
int x = Key[i];
Key[i] = Key[VertexN];
VertexN--;
if(Compare(Key[i],x)) ShiftUp(i);
else if(Compare(Key[i], x)) ShiftDown(i,VertexN);
}
void Heap::DeleteTop() {
Delete(1);
}
int Heap::GetTop() {
return Key[1];
}
void Heap::PrintHeap() {
for(int i = 1; i <= VertexN; i++)
cout<<Key[i]<<" ";
cout<<endl;
}
void Heap::SetValue(int A[], int n) {
VertexN = n;
for(int i = 1; i <= n; i++)
Key[i] = A[i];
}
void Heap::HeapSort() {
int n = VertexN;
for(int i = VertexN; i >= 2; i--){
swap(Key[1], Key[i]);
ShiftDown(1,--n);
PrintHeap();
}
}
void Heap::GetValue(int *A) {
for(int i = 1; i <= VertexN; i++)
A[i] = Key[i];
}
bool Heap::Compare(int a, int b) {
if(IsMaxHeap){
if(a > b) return true;
else return false;
}else{
if(a < b) return true;
else return true;
}
}
#ifndef GREEDYMANNER_DISJOINTSET_H
#define GREEDYMANNER_DISJOINTSET_H
const int MAXSIZE = 20;
class DisjointSet {
//use array to represent a forest
int Forest[MAXSIZE];
int Rank[MAXSIZE];
int VertexN;
public:
DisjointSet();
DisjointSet(int n);
void MakeSet(int A[], int R[], int n);
int Find(int x);
void Union(int x, int y);
void PrintDisjointSet();
};
#endif //GREEDYMANNER_DISJOINTSET_H
#include "DisjointSet.h"
#include <iostream>
using namespace std;
DisjointSet::DisjointSet(int n) {
VertexN = n;
for(int i = 1; i <= n; i++){
Forest[i] = i; //point to the root
Rank[i] = 0; //initially, the rank is 0
}
}
DisjointSet::DisjointSet() {
}
void DisjointSet::MakeSet(int A[], int R[], int n) {
VertexN = n;
for(int i = 1; i <= n; i++){
Forest[i] = A[i]; //point to the root
Rank[i] = R[i];
}
}
int DisjointSet::Find(int x) {
int parent = Forest[x];
while(parent != Forest[parent]){
parent = Forest[parent];
}
int root = parent;
parent = x;
while (parent != Forest[parent]){
int w = Forest[parent]; //record parent
Forest[parent] = root; //point to the root
parent = w; //shift up
}
return root;
}
void DisjointSet::Union(int x, int y) {
int root1 = Find(x);
int root2 = Find(y);
if(Rank[root1] <= Rank[root2]){
Forest[root1] = root2;
if(Rank[root1] == Rank[root2])
Rank[root2]++;
} else
Forest[root2] = root1;
}
void DisjointSet::PrintDisjointSet() {
for(int i = 1; i <= VertexN; i++){
cout<<"("<<i<<","<<Forest[i]<<","<<Rank[i]<<")"<<" ";
}
cout<<endl;
}