From f12e4545d945aa4646e215493fb798de17d7900e Mon Sep 17 00:00:00 2001
From: Julien David <david@lipn.univ-paris13.fr>
Date: Mon, 18 Oct 2021 14:20:43 +0200
Subject: [PATCH] Ajout code Tas + HeapSort

---
 src/binary_heap.hpp     | 114 ++++++++++++++++++++++++++++++++++++++++
 src/max_binary_heap.hpp |  20 +++++++
 src/min_binary_heap.hpp |  20 +++++++
 src/test                | Bin 0 -> 48128 bytes
 src/test.cpp            |  52 ++++++++++++++++++
 5 files changed, 206 insertions(+)
 create mode 100644 src/binary_heap.hpp
 create mode 100644 src/max_binary_heap.hpp
 create mode 100644 src/min_binary_heap.hpp
 create mode 100755 src/test
 create mode 100644 src/test.cpp

diff --git a/src/binary_heap.hpp b/src/binary_heap.hpp
new file mode 100644
index 0000000..e62e974
--- /dev/null
+++ b/src/binary_heap.hpp
@@ -0,0 +1,114 @@
+#ifndef __BINARY_HEAP_HPP__
+#define __BINARY_HEAP_HPP__
+#include<iostream>
+#include <exception>
+
+class FullBinaryHeapException: public std::exception{
+  virtual const char* what() const throw()
+  {
+    return "Cannot add value in a full Heap";
+  }
+};
+
+
+
+template <typename T>
+class BinaryHeap{
+private:
+  T * data;
+  size_t size;
+  size_t max;
+  size_t counter_swap_up;
+  size_t counter_swap_down;
+
+protected:
+  virtual bool heap_cmp(T & value1, T & value2) = 0;
+  
+public:
+  BinaryHeap(size_t max){
+    this->max = max;
+    this->size = 0;
+    this->data = new T[max];
+    counter_swap_up = 0;
+    counter_swap_down = 0;
+  }
+
+  ~BinaryHeap(){
+    delete this->data;
+  }
+
+  bool isEmpty(){
+    return size == 0;
+  }
+
+  size_t getSize(){
+    return this->size;
+  }
+
+  void resetCounters(){
+    counter_swap_up = 0;
+    counter_swap_down = 0;
+  }
+
+  size_t getSwapsCounters(){
+    return counter_swap_down + counter_swap_up;
+  }
+
+  inline int parent(int position){
+    return (position-1)/2;
+  }
+
+  inline int left_child(int position){
+    return position*2+1;
+  }
+
+  inline int right_child(int position){
+    return position*2+2;
+  }
+  
+  void heapify_up(int position){
+    while(position > 0 && heap_cmp(data[position], data[parent(position)])){
+      std::swap(data[parent(position)], data[position]);
+      counter_swap_up++;
+      position = parent(position);
+    }
+  }
+
+  void heapify_down(int position){
+    int min_child;
+    min_child = heap_cmp(data[left_child(position)], data[right_child(position)])? left_child(position): right_child(position);
+    while(min_child < (size-1) && heap_cmp(data[min_child], data[position])){
+      std::swap(data[min_child], data[position]);
+      position = min_child;
+      min_child = heap_cmp(data[left_child(position)],data[right_child(position)])? left_child(position): right_child(position);
+      counter_swap_down++;
+    }
+  }
+  
+  void insert(T value) {
+    if(size == max)
+      throw new FullBinaryHeapException();
+    data[size++] = value;
+    heapify_up(size-1);
+  }
+
+  T extract(){
+    std::swap(data[0], data[size-1]);
+    heapify_down(0);
+    return data[--size];
+  }
+
+  friend std::ostream& operator<<(std::ostream& os, const BinaryHeap<int>& heap);
+  
+};
+
+std::ostream& operator<<(std::ostream& os, const BinaryHeap<int>& heap)
+{
+  for( int i = 0; i < heap.size; i++)
+    os<<heap.data[i]<<" ";
+  os<<std::endl;
+  return os;
+}
+
+
+#endif
diff --git a/src/max_binary_heap.hpp b/src/max_binary_heap.hpp
new file mode 100644
index 0000000..e8852a9
--- /dev/null
+++ b/src/max_binary_heap.hpp
@@ -0,0 +1,20 @@
+#ifndef __MAX_BINARY_HEAP_HPP__
+#define __MAX_BINARY_HEAP_HPP__
+#include<iostream>
+
+#include"binary_heap.hpp"
+
+template <typename T>
+class MaxBinaryHeap: public BinaryHeap<T>{
+protected:
+  bool heap_cmp(T & value1, T & value2){
+    return value1 > value2;
+  }
+
+public:
+  MaxBinaryHeap(size_t max): BinaryHeap<T>(max){}
+  
+};
+
+
+#endif
diff --git a/src/min_binary_heap.hpp b/src/min_binary_heap.hpp
new file mode 100644
index 0000000..db3a366
--- /dev/null
+++ b/src/min_binary_heap.hpp
@@ -0,0 +1,20 @@
+#ifndef __MIN_BINARY_HEAP_HPP__
+#define __MIN_BINARY_HEAP_HPP__
+#include<iostream>
+
+#include"binary_heap.hpp"
+
+template <typename T>
+class MinBinaryHeap: public BinaryHeap<T>{
+protected:
+  bool heap_cmp(T & value1, T & value2){
+    return value1 < value2;
+  }
+
+public:
+  MinBinaryHeap(size_t max): BinaryHeap<T>(max){}
+  
+};
+
+
+#endif
diff --git a/src/test b/src/test
new file mode 100755
index 0000000000000000000000000000000000000000..0d6511c33bfabebdbfdafdf8862923c4b02c4de6
GIT binary patch
literal 48128
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

literal 0
HcmV?d00001

diff --git a/src/test.cpp b/src/test.cpp
new file mode 100644
index 0000000..374d02a
--- /dev/null
+++ b/src/test.cpp
@@ -0,0 +1,52 @@
+#include<iostream>
+#include"min_binary_heap.hpp"
+
+
+MinBinaryHeap<int> * initialize_heap(size_t size){
+  static MinBinaryHeap<int> * mbh = NULL;
+  if(mbh == NULL)
+    mbh = new MinBinaryHeap<int>(size);
+  else if(mbh->getSize() < size){
+    delete mbh;
+    mbh = new MinBinaryHeap<int>(size);
+  }    
+  return mbh;
+}
+
+size_t heap_sort(int * permutation, size_t size){
+  int i;
+  MinBinaryHeap<int> * mbh = initialize_heap(size);
+  mbh->resetCounters();
+  for(i = 0; i < size; i++)
+    mbh->insert(permutation[i]);
+  for(i = 0; i < size; i++)
+    permutation[i] = mbh->extract();
+  return mbh->getSwapsCounters();
+}
+
+
+
+void random_permutation(int * permutation, size_t size){
+  int i;
+  for(i = 0; i < size; i++)
+    permutation[i] = i;
+  for(i = 0; i < size; i++)
+    std::swap(permutation[i], permutation[i+rand()%(size-i)]);  
+}
+
+int main(int argc, char ** argv){
+  int permutation[1024];
+  int size, xp;
+  int xp_num = 1000;
+  double mean;
+  
+  for(size = 4; size <= 1024; size = 2*size){
+    mean= 0;
+    for(xp = 0; xp < xp_num; xp++){
+      random_permutation(permutation, size);
+      mean +=heap_sort(permutation, size);
+    }
+    printf("%d %lf\n", size, mean/xp_num);
+  }
+  return EXIT_SUCCESS;
+}
-- 
GitLab