1. //
    2. // Created by TeneChang on 2020/10/28.
    3. //
    4. #include "Heap.h"
    5. #include <iostream>
    6. using namespace std;
    7. Heap::Heap(bool _isMaxHeap) {
    8. IsMaxHeap = _isMaxHeap;
    9. }
    10. Heap::Heap(int _Key[], int _VertexN, bool _IsMaxHeap) {
    11. IsMaxHeap = IsMaxHeap;
    12. VertexN = 0;
    13. for(int i = 1; i <= _VertexN; i++){
    14. Insert(_Key[i]);
    15. }
    16. }
    17. void Heap::ShiftUp(int i) {
    18. if(i == 1)
    19. return;
    20. while(i > 1){
    21. if(Compare(Key[i],Key[i/2])){
    22. swap(Key[i],Key[i/2]);
    23. } else break;
    24. //shift up util it is smaller than its parent or reaches the top
    25. i = i/2;
    26. }
    27. return;
    28. }
    29. void Heap::ShiftDown(int i, int n) {
    30. //node i is a leaf node
    31. if(2*i > n)
    32. return;
    33. while(2*i <= n){
    34. //swap with the larger children
    35. i = 2*i;
    36. if(i+1 <= n && Compare(Key[i+1],Key[i])){
    37. i = i+1;
    38. }
    39. if(Compare(Key[i],Key[i/2])){
    40. swap(Key[i],Key[i/2]);
    41. } else break;
    42. }
    43. return;
    44. }
    45. void Heap::Insert(int key) {
    46. VertexN++;
    47. Key[VertexN] = key;
    48. ShiftUp(VertexN);
    49. }
    50. void Heap::Delete(int i) {
    51. int x = Key[i];
    52. Key[i] = Key[VertexN];
    53. VertexN--;
    54. if(Compare(Key[i],x)) ShiftUp(i);
    55. else if(Compare(Key[i], x)) ShiftDown(i,VertexN);
    56. }
    57. void Heap::DeleteTop() {
    58. Delete(1);
    59. }
    60. int Heap::GetTop() {
    61. return Key[1];
    62. }
    63. void Heap::PrintHeap() {
    64. for(int i = 1; i <= VertexN; i++)
    65. cout<<Key[i]<<" ";
    66. cout<<endl;
    67. }
    68. void Heap::SetValue(int A[], int n) {
    69. VertexN = n;
    70. for(int i = 1; i <= n; i++)
    71. Key[i] = A[i];
    72. }
    73. void Heap::HeapSort() {
    74. int n = VertexN;
    75. for(int i = VertexN; i >= 2; i--){
    76. swap(Key[1], Key[i]);
    77. ShiftDown(1,--n);
    78. PrintHeap();
    79. }
    80. }
    81. void Heap::GetValue(int *A) {
    82. for(int i = 1; i <= VertexN; i++)
    83. A[i] = Key[i];
    84. }
    85. bool Heap::Compare(int a, int b) {
    86. if(IsMaxHeap){
    87. if(a > b) return true;
    88. else return false;
    89. }else{
    90. if(a < b) return true;
    91. else return true;
    92. }
    93. }
    1. #ifndef GREEDYMANNER_DISJOINTSET_H
    2. #define GREEDYMANNER_DISJOINTSET_H
    3. const int MAXSIZE = 20;
    4. class DisjointSet {
    5. //use array to represent a forest
    6. int Forest[MAXSIZE];
    7. int Rank[MAXSIZE];
    8. int VertexN;
    9. public:
    10. DisjointSet();
    11. DisjointSet(int n);
    12. void MakeSet(int A[], int R[], int n);
    13. int Find(int x);
    14. void Union(int x, int y);
    15. void PrintDisjointSet();
    16. };
    17. #endif //GREEDYMANNER_DISJOINTSET_H
    18. #include "DisjointSet.h"
    19. #include <iostream>
    20. using namespace std;
    21. DisjointSet::DisjointSet(int n) {
    22. VertexN = n;
    23. for(int i = 1; i <= n; i++){
    24. Forest[i] = i; //point to the root
    25. Rank[i] = 0; //initially, the rank is 0
    26. }
    27. }
    28. DisjointSet::DisjointSet() {
    29. }
    30. void DisjointSet::MakeSet(int A[], int R[], int n) {
    31. VertexN = n;
    32. for(int i = 1; i <= n; i++){
    33. Forest[i] = A[i]; //point to the root
    34. Rank[i] = R[i];
    35. }
    36. }
    37. int DisjointSet::Find(int x) {
    38. int parent = Forest[x];
    39. while(parent != Forest[parent]){
    40. parent = Forest[parent];
    41. }
    42. int root = parent;
    43. parent = x;
    44. while (parent != Forest[parent]){
    45. int w = Forest[parent]; //record parent
    46. Forest[parent] = root; //point to the root
    47. parent = w; //shift up
    48. }
    49. return root;
    50. }
    51. void DisjointSet::Union(int x, int y) {
    52. int root1 = Find(x);
    53. int root2 = Find(y);
    54. if(Rank[root1] <= Rank[root2]){
    55. Forest[root1] = root2;
    56. if(Rank[root1] == Rank[root2])
    57. Rank[root2]++;
    58. } else
    59. Forest[root2] = root1;
    60. }
    61. void DisjointSet::PrintDisjointSet() {
    62. for(int i = 1; i <= VertexN; i++){
    63. cout<<"("<<i<<","<<Forest[i]<<","<<Rank[i]<<")"<<" ";
    64. }
    65. cout<<endl;
    66. }